version-control mercurial - Qual è la differenza tra hg forget e hg remove?




vs git (5)

Il modo migliore per farlo è che hg forget è identico a hg remove tranne per il fatto che lascia i file nella tua copia di lavoro. I file vengono lasciati indietro come file non tracciati e ora possono essere ignorati facoltativamente con un modello in .hgignore .

In altre parole, non posso dire se hai usato hg forget o hg remove quando tiro da te. Un file che hai eseguito hg forget on verrà eliminato quando eseguirò l'aggiornamento a quel changeset, proprio come se avessi usato hg remove .

Voglio mercurial per rimuovere diversi file dallo stato corrente del repository. Tuttavia, voglio che i file esistano nella cronologia precedente.

In che modo forget e remove differiscono e possono fare ciò che voglio?


' hg forget ' è solo una scorciatoia per ' hg remove -Af '. hg remove ' hg remove ':

... e -Af può essere utilizzato per rimuovere i file dalla revisione successiva senza eliminarli dalla directory di lavoro.

In -Af : ' remove ' cancella il file dalla copia di lavoro su disco (a meno che non si usi -Af ) e ' forget ' no.


Se si utilizza "hg remove b" su un file con stato "A", il che significa che è stato aggiunto ma non impegnato, Mercurial risponderà:

  not removing b: file has been marked for add (use forget to undo)

Questa risposta è una spiegazione molto chiara della differenza tra rimuovere e dimenticare.

La mia comprensione è che "hg forget" serve per annullare un file aggiunto ma non impegnato, in modo che non venga tracciato dal controllo della versione; mentre "hg remove" serve per estrarre un file impegnato dal controllo di versione.

Questo thread ha un esempio per utilizzare hg remove contro file di 7 diversi tipi di stato.


Dalla documentazione, apparentemente si può usare un comando per mantenere il file nella cronologia del progetto. Sembra che tu voglia rimuovere, poiché cancella anche il file dalla directory di lavoro.

Dal libro Mercurial su http://hgbook.red-bean.com/read/ :

La rimozione di un file non influisce sulla sua cronologia. È importante capire che la rimozione di un file ha solo due effetti. Rimuove la versione corrente del file dalla directory di lavoro. Arresta Mercurial dal tracciamento delle modifiche al file, dal momento del prossimo commit. La rimozione di un file non altera in alcun modo la cronologia del file.

La pagina man hg (1) dice di dimenticare:

Contrassegna i file specificati in modo che non vengano più tracciati dopo il prossimo commit. Rimuove solo i file dal ramo corrente, non dall'intera cronologia del progetto, e non li elimina dalla directory di lavoro.

E questo per rimuovere:

Pianifica i file indicati per la rimozione dal repository. Rimuove solo i file dal ramo corrente, non dall'intera cronologia del progetto.


Sulla base delle mie esperienze simili, la soluzione offerta da Strahinja Kustudic sopra è di gran lunga la migliore. Come altri hanno sottolineato, la semplice reimpostazione completa rimuoverà tutti i file non tracciati che potrebbero includere molte cose che non si desidera rimuovere, come i file di configurazione. Ciò che è più sicuro, è quello di rimuovere solo i file che stanno per essere aggiunti, e per questo, è probabile che si voglia anche fare il checkout di tutti i file modificati localmente che stanno per essere aggiornati.

Tenendo a mente, ho aggiornato lo script di Kustudic per fare proprio questo. Ho anche corretto un refuso (mancante nell'originale).

#/bin/sh

# Fetch the newest code
git fetch

# Delete all files which are being added,
# so there are no conflicts with untracked files
for file in `git diff HEAD..origin/master --name-status | awk '/^A/ {print $2}'`
do
    echo "Deleting untracked file $file..."
    rm -vf "$file"
done

# Checkout all files which have been locally modified
for file in `git diff HEAD..origin/master --name-status | awk '/^M/ {print $2}'`
do
    echo "Checking out modified file $file..."
    git checkout $file
done

# Finally merge all the changes (you could use merge here as well)
git pull




version-control mercurial