Mam lokalne zmiany w pliku, których nie chcę zatwierdzać w moim repozytorium. Jest to plik konfiguracyjny do budowy aplikacji na serwerze, ale chcę budować lokalnie z różnymi ustawieniami. Oczywiście plik zawsze pojawia się, gdy robię „status git” jako coś, co można inscenizować. Chciałbym ukryć tę konkretną zmianę i jej nie zatwierdzać. Nie wprowadzę żadnych innych zmian w pliku.
Po krótkich poszukiwaniach widzę 2 opcje: „zakładaj bez zmian” i „pomiń”. Poprzednie pytanie tutaj mówi o nich, ale tak naprawdę nie wyjaśnia ich różnic. Moje pytanie brzmi: czym różnią się te dwa polecenia? Dlaczego ktoś miałby korzystać z jednego lub drugiego?
.gitignore
do podobnych celów. Czy to rozwiązanie działałoby dla Ciebie?Odpowiedzi:
Chcesz
skip-worktree
.assume-unchanged
jest przeznaczony do przypadków, w których sprawdzenie, czy grupa plików została zmodyfikowana, jest kosztowne; po ustawieniu bitugit
(oczywiście) zakłada się, że pliki odpowiadające tej części indeksu nie zostały zmodyfikowane w kopii roboczej. Pozwala to uniknąć bałaganustat
połączeń. Ten bit jest tracony za każdym razem, gdy zmienia się pozycja pliku w indeksie (więc gdy plik jest zmieniany w górę).skip-worktree
to coś więcej: nawet jeśligit
wie, że plik został zmodyfikowany (lub musi zostać zmodyfikowany przez areset --hard
lub podobny), będzie udawał, że tak nie było, używając zamiast tego wersji z indeksu. Trwa to do momentu odrzucenia indeksu.Istnieje dobre podsumowanie konsekwencji tej różnicy i typowych przypadków użycia tutaj: http://fallengamer.livejournal.com/93321.html .
Z tego artykułu:
--assume-unchanged
zakłada, że programista nie powinien zmieniać pliku. Ta flaga służy do poprawy wydajności niezmienionych folderów, takich jak zestawy SDK.--skip-worktree
jest przydatny, gdy instruujesz git, aby nie dotykał określonego pliku, ponieważ programiści powinni go zmienić. Na przykład, jeśli w głównym repozytorium nadrzędnym znajdują się niektóre gotowe do produkcji pliki konfiguracyjne i nie chcesz przypadkowo zatwierdzać zmian w tych plikach,--skip-worktree
to dokładnie to, czego chcesz.źródło
--skip-worktree
efekty i rozbroić flagę, dostępna jest--no-skip-worktree
opcja. Działa dokładnie w ten sam sposób. Jest to przydatne w przypadku, gdy ręka się poślizgnęła i niewłaściwe pliki zostały oflagowane, lub jeśli okoliczności się zmieniły i wcześniej pomijane pliki nie powinny być dłużej ignorowane.--skip-worktree
a.git/info/exclude
plikiem polega na tym, że ten pierwszy będzie działał nawet dla plików, które są obecnie śledzone..git/info/exclude
, na przykład.gitignore
, zapobiegnie tylko przypadkowemu dodaniu nieśledzonych plików do indeksu, ale nie spowoduje zmian w plikach, które są już śledzone.git update-index --skip-worktree <file_name>
Uwaga: fallengamer przeprowadził kilka testów w 2011 roku (więc mogą być nieaktualne), a oto jego ustalenia :
Operacje
git pull
:Git i tak zachowuje lokalne zmiany.
W ten sposób nie stracisz przypadkowo żadnych danych oznaczonych dowolną z flag.
assume-unchanged
flagą: Git nie nadpisuje lokalnego pliku. Zamiast tego generowałby konflikty i doradzał, jak je rozwiązaćskip-worktree
flagą: Git nie nadpisuje lokalnego pliku. Zamiast tego generowałby konflikty i doradzał, jak je rozwiązaćgit stash
git pull
skip-worktree
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ę powiedzieskip-worktree
flagą: Skrytka nie działa naskip-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
.git pull
assume-unchanged
assume-unchanged
flagą: treść jest aktualizowana, flaga została utracona.„
git ls-files -v
” pokazuje, że flaga jest zmodyfikowana naH
(zh
).skip-worktree
flagą: treść jest aktualizowana, flaga zostaje zachowana.„
git ls-files -v
” Pokaże taką samąS
flagę jak przedpull
.git reset --hard
skip-worktree
assume-unchanged
assume-unchanged
flagą: zawartość pliku jest cofana. Flaga jest resetowana doH
(zh
).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 flagipull
.Ale zignorowanie polecenia „
reset --hard
” może stać się przykrą niespodzianką dla programisty.Assume-unchanged
Flaga może zostać utracona podczaspull
operacji, a lokalne zmiany w takich plikach nie wydają się być ważne dla git.Widzieć:
Komentarz Junio (obecny opiekun git) dotyczący zamiaru
assume-unchanged
,W szczególności, Junio zwraca uwagę, że zmiany w
assume-unchanged
plikach mógł zostać przypadkowo popełnione: „jeśli Git może określić ścieżkę, która jest oznaczona jakoassume-unchanged
uległ zmianie bez ponoszenia dodatkowych lstat (2) koszty, zastrzega sobie prawo do raportu, że tor został zmodyfikowany ( w rezultaciegit commit -a
może zatwierdzić tę zmianę) ”.różnica między
assume-unchanged
iskip-worktree
jak omówiono na liście mailowej git po dodaniuskip-worktree
łatki .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 )
git update-index
Strona podręcznika zawiera teraz:Ta ostatnia część jest tym, co opisuję typowym sterownikiem filtru treści opartym na smudge / clean scripts .
źródło