Uwaga: fallengamer przeprowadził kilka testów w 2011 roku (więc mogą być nieaktualne), a oto jego ustalenia :
Operacje
- Plik jest zmieniany zarówno w lokalnym repozytorium, jak i wcześniej
git pull
:
Git i tak zachowuje lokalne zmiany.
W ten sposób nie stracisz przypadkowo żadnych danych oznaczonych dowolną z flag.
- Plik z
assume-unchanged
flagą: Git nie nadpisuje lokalnego pliku. Zamiast tego generowałby konflikty i doradzał, jak je rozwiązać
- Plik z
skip-worktree
flagą: Git nie nadpisuje lokalnego pliku. Zamiast tego generowałby konflikty i doradzał, jak je rozwiązać
- Plik jest zmieniany zarówno w lokalnym repozytorium, jak i w górę, próbując i tak wyciągnąć.
Wykorzystuje wyniki w dodatkowej pracy ręcznej, ale przynajmniej nie straciłbyś żadnych danych, gdybyś miał jakieś lokalne zmiany.
git stash
git pull
skip-worktree
- Plik z
assume-unchanged
flagą: odrzuca wszystkie lokalne zmiany bez możliwości ich przywrócenia. Efekt jest jak „ git reset --hard
”. ' git pull
' połączenie się powiedzie
- Plik z
skip-worktree
flagą: Skrytka nie działa na skip-worktree
plikach. „ git pull
” zakończy się niepowodzeniem z takim samym błędem jak powyżej. Deweloper jest zmuszony ręcznie zresetować skip-worktree
flagę, aby móc ukryć i zakończyć awarię pull
.
- Bez zmian lokalnych, zmieniono plik nadrzędny
Obie flagi nie uniemożliwiłyby uzyskania zmian nadrzędnych. Git wykrywa, że złamałeś obietnicę i postanawia odzwierciedlić rzeczywistość, resetując flagę.
git pull
assume-unchanged
- Plik z
assume-unchanged
flagą: treść jest aktualizowana, flaga została utracona.
„ git ls-files -v
” pokazuje, że flaga jest zmodyfikowana na H
(z h
).
- Plik z
skip-worktree
flagą: treść jest aktualizowana, flaga zostaje zachowana.
„ git ls-files -v
” Pokaże taką samą S
flagę jak przed pull
.
- Po zmianie pliku lokalnego
Git nie dotyka pliku i odzwierciedla rzeczywistość (plik, który obiecał pozostać niezmieniony, został zmieniony) dla pliku.
git reset --hard
skip-worktree
assume-unchanged
- Plik z
assume-unchanged
flagą: zawartość pliku jest cofana. Flaga jest resetowana do H
(z h
).
- Plik z
skip-worktree
flagą: zawartość pliku jest nienaruszona. Flaga pozostaje taka sama.
Dodaje następującą analizę:
Wygląda na skip-worktree
to, że bardzo się starasz zachować swoje lokalne dane . Ale to nie zapobiega otrzymywaniu zmian, jeśli jest to bezpieczne. Plus git nie resetuje flagi pull
.
Ale zignorowanie polecenia „ reset --hard
” może stać się przykrą niespodzianką dla programisty.
Assume-unchanged
Flaga może zostać utracona podczas pull
operacji, a lokalne zmiany w takich plikach nie wydają się być ważne dla git.
Widzieć:
Podsumowuje:
W rzeczywistości żadna z flag nie jest wystarczająco intuicyjna .
assume-unchanged
zakłada, że programista nie powinien zmieniać pliku. Jeśli plik został zmieniony - zmiana ta nie jest ważna. Ta flaga służy do poprawy wydajności niezmienionych folderów, takich jak zestawy SDK.
Ale jeśli obietnica zostanie złamana, a plik faktycznie zmieniony, git cofa flagę, aby odzwierciedlić rzeczywistość. Prawdopodobnie dobrze jest mieć niespójne flagi w folderach, których nie można zmienić.
Z drugiej strony skip-worktree
jest przydatny, gdy instruujesz git, aby nigdy nie dotykał określonego pliku. Jest to przydatne w przypadku już śledzonego pliku konfiguracyjnego.
W głównym repozytorium nadrzędnym znajduje się konfiguracja gotowa do produkcji, ale chcesz zmienić niektóre ustawienia w konfiguracji, aby móc przeprowadzić lokalne testy. I nie chcesz przypadkowo sprawdzać zmian w takim pliku, aby wpłynąć na konfigurację produkcyjną. W takim przypadku skip-worktree
tworzy idealną scenę.
W Git 2.25.1 (luty 2020 r.) Wspomniane powyżej „Właściwie żadna z flag nie jest wystarczająco intuicyjna” zostało wyjaśnione:
Zobacz zatwierdzenie 7a2dc95 , zatwierdzenie 1b13e90 (22 stycznia 2020 r.) Autor: brian m. carlson ( bk2204
) .
(Scalony przez Junio C Hamano - gitster
- w commit 53a8329 , 30 stycznia 2020)
( Git Mailing list )
doc
: zniechęcaj użytkowników do ignorowania śledzonych plików
Podpisano: Jeff King
Podpisano: brian m. Carlson
Użytkownicy często ignorują zmiany w pliku, który śledzi Git.
Typowymi scenariuszami w tym przypadku są ustawienia IDE i pliki konfiguracyjne, które zasadniczo nie powinny być śledzone i prawdopodobnie generowane z plików śledzonych przy użyciu mechanizmu szablonów.
Jednak użytkownicy dowiadują się o bitach „zakładaj niezmienione” i „pomiń”, i i tak próbuj ich użyć.
Jest to problematyczne, ponieważ po ustawieniu tych bitów wiele operacji zachowuje się zgodnie z oczekiwaniami użytkownika, ale zwykle nie pomaga, gdy git checkout
trzeba wymienić plik.
W tym przypadku nie ma rozsądnego zachowania, ponieważ czasami dane są cenne, takie jak niektóre pliki konfiguracyjne, a czasem nieistotne dane, które użytkownik chętnie odrzuci.
Ponieważ nie jest to obsługiwana konfiguracja, a użytkownicy są skłonni do niewłaściwego wykorzystywania istniejących funkcji do niezamierzonych celów, powodując ogólny smutek i zamieszanie , udokumentujmy istniejące zachowanie i pułapki w dokumentacji git update-index
, aby użytkownicy wiedzieli, że powinni zbadać alternatywne rozwiązania.
Ponadto zapewnijmy zalecane rozwiązanie radzenia sobie ze zwykłym przypadkiem plików konfiguracyjnych, ponieważ istnieją dobrze znane podejścia stosowane z powodzeniem w wielu środowiskach.
git update-index
Strona podręcznika zawiera teraz:
Użytkownicy często próbują użyć bitów assume-unchanged
i, skip-worktree
aby powiedzieć Gitowi, aby ignorował zmiany w śledzonych plikach. Nie działa to zgodnie z oczekiwaniami, ponieważ Git może nadal sprawdzać działające pliki drzewa pod kątem indeksu podczas wykonywania niektórych operacji. Ogólnie rzecz biorąc, Git nie umożliwia ignorowania zmian w śledzonych plikach, dlatego zalecane są alternatywne rozwiązania.
Na przykład, jeśli plik, który chcesz zmienić, jest jakimś plikiem konfiguracyjnym, repozytorium może zawierać przykładowy plik konfiguracyjny, który można następnie skopiować do zignorowanej nazwy i zmodyfikować. Repozytorium może nawet zawierać skrypt traktujący przykładowy plik jako szablon, automatycznie go modyfikując i kopiując.
Ta ostatnia część jest tym, co opisuję typowym sterownikiem filtru treści opartym na smudge / clean scripts .
.gitignore
do podobnych celów. Czy to rozwiązanie działałoby dla Ciebie?