Non credo che un commit Git possa registrare un'intenzione come "smettere di tracciare questo file, ma non cancellarlo".
L'attivazione di tale intenzione richiederà l'intervento al di fuori di Git in tutti i repository che uniscono (o si rifanno su) un commit che elimina il file.
Salva una copia, Applica eliminazione, Ripristina
Probabilmente la cosa più semplice da fare è dire agli utenti a valle di salvare una copia del file, estrarre la cancellazione, quindi ripristinare il file. Se stanno eseguendo il pull tramite rebase e stanno "apportando" modifiche al file, avranno conflitti. Per risolvere tali conflitti, utilizzaregit rm foo.conf && git rebase --continue
(se il commit in conflitto ha delle modifiche oltre a quelle del file rimosso) o git rebase --skip
(se il commit in conflitto è stato modificato solo nel file rimosso).
Ripristina il file come non tracciato dopo aver tirato un commit che lo elimina
Se hanno già eseguito il commit della cancellazione, possono comunque recuperare la versione precedente del file con git show :
git show @{1}:foo.conf >foo.conf
O con git checkout (per commento di William Pursell; ma ricordati di rimuoverlo dall'indice!):
git checkout @{1} -- foo.conf && git rm --cached foo.conf
Se hanno intrapreso altre azioni da quando hanno tirato la tua cancellazione (o stanno tirando con rebase in una TESTA staccata), potrebbero aver bisogno di qualcosa di diverso @{1}
. Potrebbero usaregit log -g
per trovare il commit appena prima di aver rimosso la tua cancellazione.
In un commento, si menziona che il file che si desidera "non tracciare, ma mantenere" è una sorta di file di configurazione necessario per eseguire il software (direttamente da un repository).
Mantieni il file come "predefinito" e attivalo manualmente / automaticamente
Se non è del tutto inaccettabile continuare a mantenere il contenuto del file di configurazione nel repository, potresti essere in grado di rinominare il file monitorato da (ad esempio) foo.conf
a foo.conf.default
e quindi istruire i tuoi utenti a cp foo.conf.default foo.conf
dopo aver applicato il commit di rinomina. Oppure, se gli utenti utilizzano già una parte esistente del repository (ad esempio uno script o qualche altro programma configurato dal contenuto nel repository (ad esempio Makefile
o simile)) per avviare / distribuire il software, è possibile incorporare un meccanismo predefinito nel lancio / processo di distribuzione:
test -f foo.conf || test -f foo.conf.default &&
cp foo.conf.default foo.conf
Con un tale meccanismo inadempiente luogo, gli utenti devono essere in grado di tirare un commit che rinomina foo.conf
afoo.conf.default
senza dover fare alcun lavoro supplementare. Inoltre, si evita di dover copiare manualmente un file di configurazione se si effettuano installazioni / repository aggiuntivi in futuro.
La riscrittura della cronologia richiede comunque un intervento manuale ...
Se è inaccettabile mantenere il contenuto nel repository, probabilmente vorrai sradicarlo completamente dalla storia con qualcosa del genere git filter-branch --index-filter …
. Ciò equivale a riscrivere la cronologia, che richiederà un intervento manuale per ciascun ramo / repository (consultare la sezione "Ripristino dal rebase upstream" nella manpage git rebase ). Il trattamento speciale richiesto per il tuo file di configurazione sarebbe solo un altro passo che devi eseguire durante il ripristino dalla riscrittura:
- Salva una copia del file di configurazione.
- Recupera dalla riscrittura.
- Ripristina il file di configurazione.
Ignoralo per prevenire la ricorrenza
Qualunque metodo tu usi, probabilmente vorrai includere il nome del file di configurazione in un .gitignore
file nel repository in modo che nessuno possa inavvertitamente di git add foo.conf
nuovo (è possibile, ma richiede -f
/ --force
). Se hai più di un file di configurazione, potresti considerare di "spostarli" tutti in una singola directory e ignorare il tutto ("spostando" intendo cambiare dove si aspetta che il programma trovi i suoi file di configurazione e ottenere gli utenti (o il lancio / meccanismo di deploy) per copiare / spostare i file nella nuova posizione, ovviamente non vorrebbe git mv un file in una directory che vi sarà ignorando).