Nie sądzę, aby zatwierdzenie Git mogło zarejestrować intencję typu „przestań śledzić ten plik, ale nie usuwaj go”.
Realizacja takiego zamiaru będzie wymagała interwencji poza Git we wszystkich repozytoriach, które łączą się (lub ponownie bazują na) zatwierdzeniu, które usuwa plik.
Zapisz kopię, zastosuj usunięcie, przywróć
Prawdopodobnie najłatwiejszą rzeczą do zrobienia jest poinformowanie dalszych użytkowników, aby zapisali kopię pliku, wycofali usunięcie, a następnie przywrócili plik. Jeśli ściągają przez rebase i „przenoszą” modyfikacje do pliku, będą miały konflikty. Aby rozwiązać takie konflikty, użyj git rm foo.conf && git rebase --continue
(jeśli konfliktowe zatwierdzenie zawiera zmiany inne niż te w usuniętym pliku) lub git rebase --skip
(jeśli konfliktujące zatwierdzenie zmieniło się tylko na usunięty plik).
Przywróć plik jako nieśledzony po wyciągnięciu zatwierdzenia, które go usuwa
Jeśli już wyciągnęli zatwierdzenie usunięcia, nadal mogą odzyskać poprzednią wersję pliku za pomocą git show :
git show @{1}:foo.conf >foo.conf
Lub z git checkout (za komentarzem Williama Pursella; ale pamiętaj, aby ponownie usunąć go z indeksu!):
git checkout @{1} -- foo.conf && git rm --cached foo.conf
Jeśli podjęli inne działania od czasu usunięcia twojego usunięcia (lub ciągną z rebase do odłączonego HEAD), mogą potrzebować czegoś innego niż @{1}
. Mogliby użyć git log -g
do znalezienia zatwierdzenia tuż przed usunięciem.
W komentarzu wspominasz, że plik, który chcesz „odśledzić, ale zachować” to jakiś rodzaj pliku konfiguracyjnego, który jest wymagany do uruchomienia oprogramowania (bezpośrednio z repozytorium).
Zachowaj plik jako „domyślny” i aktywuj go ręcznie / automatycznie
Jeśli dalsze utrzymywanie zawartości pliku konfiguracyjnego w repozytorium nie jest całkowicie niedopuszczalne, możesz zmienić nazwę śledzonego pliku z (np.) foo.conf
Na, foo.conf.default
a następnie poinstruować użytkowników, aby cp foo.conf.default foo.conf
po zastosowaniu zmiany nazwy. Lub, jeśli użytkownicy już używają jakiejś istniejącej części repozytorium (np. Skryptu lub innego programu skonfigurowanego przez zawartość repozytorium (np. Makefile
Lub podobnego)) do uruchamiania / wdrażania oprogramowania, możesz włączyć mechanizm domyślny do uruchomienia / proces wdrażania:
test -f foo.conf || test -f foo.conf.default &&
cp foo.conf.default foo.conf
Mając taki mechanizm domyślny, użytkownicy powinni być w stanie pobrać zatwierdzenie, które zmienia nazwę foo.conf
na foo.conf.default
bez konieczności wykonywania dodatkowej pracy. Ponadto unikniesz konieczności ręcznego kopiowania pliku konfiguracyjnego, jeśli w przyszłości wykonasz dodatkowe instalacje / repozytoria.
Przepisanie historii i tak wymaga ręcznej interwencji…
Jeśli utrzymywanie treści w repozytorium jest niedopuszczalne, prawdopodobnie będziesz chciał całkowicie usunąć ją z historii za pomocą czegoś podobnego git filter-branch --index-filter …
. Sprowadza się to do przepisywania historii, co będzie wymagało ręcznej interwencji dla każdej gałęzi / repozytorium (zobacz sekcję „Recovering From Upstream Rebase” na stronie podręcznika git rebase ). Specjalne traktowanie wymagane dla twojego pliku konfiguracyjnego byłoby tylko kolejnym krokiem, który należy wykonać podczas odzyskiwania po przepisaniu:
- Zapisz kopię pliku konfiguracyjnego.
- Odzyskaj po przepisaniu.
- Przywróć plik konfiguracyjny.
Zignoruj to, aby zapobiec nawrotom
Bez względu na to, jakiej metody użyjesz, prawdopodobnie będziesz chciał dołączyć nazwę pliku konfiguracyjnego do .gitignore
pliku w repozytorium, aby nikt nie mógł niechcący git add foo.conf
ponownie (jest to możliwe, ale wymaga -f
/ --force
). Jeśli masz więcej niż jeden plik konfiguracyjny, możesz rozważyć `` przeniesienie '' ich wszystkich do jednego katalogu i zignorowanie całej rzeczy (przez `` przeniesienie '' mam na myśli zmianę miejsca, w którym program spodziewa się znaleźć swoje pliki konfiguracyjne i pobranie użytkowników (lub mechanizm uruchamiania / wdrażania), aby skopiować / przenieść pliki do ich nowej lokalizacji; oczywiście nie chcesz umieszczać pliku mv w katalogu, który będziesz ignorować).