Martwię się, że mogę zapomnieć o tej fajnej funkcji, gdy będę jej potrzebować następnym razem.
Git 2.13 (Q2 2017) wyjaśnia, dlaczego nie ma „ochrony” przed zapomnieniem tej opcji wypychania, ponieważ nawet jeśli nie zapomnisz jej na git pushpoziomie, może ona zostać zignorowana.
Zobacz commit f17d642 (19 kwietnia 2017) autorstwa Ævara Arnfjörð Bjarmason ( avar) .
(Scalone przez Junio C Hamano - gitster- w zobowiązaniu 46bdfa3 , 26 kwietnia 2017 r.)
push: dokumentuj i testuj za --force-with-leasepomocą wielu pilotów
Dokumentuj i testuj w przypadkach, w których istnieją dwa piloty wskazujące ten sam adres URL, a pobieranie w tle i kolejne git push --force-with-leasenie powinny blokować niezaktualizowanych referencji, których nie pobraliśmy.
Niektóre edytory, takie jak Microsoft VSC, mają funkcję automatycznego pobierania w tle, co omija zabezpieczenia oferowane przez --force-with-lease&--force-with-lease=<refname> , jak wspomniano w dodawanej tutaj dokumentacji.
Tak więc dokumentacja nagit push razie obejmuje:
ogólna uwaga na temat bezpieczeństwa: dostarczanie tej opcji bez oczekiwanej wartości, tj. jako --force-with-leaselub --force-with-lease=<refname>
bardzo źle współdziała z wszystkim, co niejawnie działa git fetchna pilocie, do którego ma być przesłany w tle, np. git fetch origin
w repozytorium w pracy cron.
Ochrona, którą oferuje, --forcepolega na zapewnieniu, że kolejne zmiany, na których nie opierała się twoja praca, nie są blokowane, ale jest to trywialne pokonanie, jeśli jakiś proces w tle aktualizuje referencje w tle. Nie mamy nic oprócz informacji o zdalnym śledzeniu, które można wykorzystać jako heurystykę dla referencji, których oczekujesz, że widziałeś i chcesz się przebić.
Jeśli twój edytor lub inny system działa git fetchw tle, sposobem na złagodzenie tego jest po prostu skonfigurowanie innego pilota:
git remote add origin-push $(git config remote.origin.url)
git fetch origin-push
Teraz, gdy proces w tle zostanie uruchomiony, git fetch originodniesienia origin-pushnie zostaną zaktualizowane, a zatem polecenia takie jak:
git push --force-with-lease origin-push
Nie powiedzie się, chyba że uruchomisz ręcznie git fetch origin-push.
Ta metoda jest oczywiście całkowicie pokonana przez coś, co działa git fetch
--all, w takim przypadku musisz ją wyłączyć lub zrobić coś bardziej żmudnego, na przykład:
git fetch # update 'master' from remote
git tag base master # mark our base point
git rebase -i master # rewrite some commits
git push --force-with-lease=master:base master:master
Czyli utworzyć basetag dla wersji kodu upstream, które widziałem i są gotowi zastąpić, a następnie przepisać historię, i wreszcie zmusić do zmiany wypychania masterjeśli pilot jest nadal w wersji base, niezależnie od tego, co się z lokalnym remotes/origin/masterzostała zaktualizowana w tło.
rmdorm -iw twoim .bashrc; pewnego dnia zapomnisz i usuniesz ważny plik na serwerze. Idąc z własnym aliasem nie ma tego problemu :)