Mam CENTRALNE repozytorium z trzema repozytoriami deweloperów, które normalnie go pobierają i wypychają.
Mam również dwa inne repozytoria, które pobierają z CENTRAL-ego repozytorium: jedno jest serwerem na żywo, a drugie serwerem testowym / etapowym - każde pobiera z własnej gałęzi.
Scenariusz jest następujący: mam post-update
skrypt przechwytujący na repozytorium CENTRAL, który automatycznie uzyskuje dostęp do repozytoriów testowych i na żywo i uruchamia polecenie pull na każdym z nich. To aktualizuje zarówno serwery testowe, jak i aktywne, wszystko w zależności od tego, który oddział ma nowe zatwierdzenia. To wszystko działa świetnie.
Problem polega na tym, że mogą wystąpić sytuacje, w których pliki mogą być aktualizowane bezpośrednio na serwerze (przez ftp lub cokolwiek innego), a skrypt CENTRAL po aktualizacji zawiedzie, ponieważ wystąpią konflikty scalania / nadpisywania. Nie da się uniknąć tego scenariusza i jest to nieuniknione.
Chciałbym, aby tak się stało: chcę, aby ściąganie z witryn na żywo i testowych zawsze nadpisywało / scalało podczas ściągania. Zawsze. Te repozytoria będą dostępne tylko w wersji „pull”, ponieważ nie są przeznaczone do opracowywania.
We wszystkich moich badaniach nie mogę znaleźć dobrego rozwiązania, aby ciąg zawsze wymuszał zastąpienie plików lokalnych. Czy to w ogóle możliwe? Jeśli tak, byłby to świetny scenariusz rozwoju.
Odpowiedzi:
Naprawdę idealnym sposobem na to jest w ogóle nie używanie
pull
, ale zamiast tegofetch
ireset
:(Zmiana
master
na gałąź, którą chcesz śledzić.)pull
jest zaprojektowany wokół łączenia w pewien sposób zmian, podczas gdyreset
po prostu dopasować lokalną kopię do określonego zatwierdzenia.Możesz rozważyć nieco inne opcje w
clean
zależności od potrzeb twojego systemu.źródło
reset --hard
to polecenie, które służy do wymuszenia stanu katalogu roboczego (i bieżącej gałęzi) do stanu pasującego do stanu określonego zatwierdzenia.FETCH_HEAD
jest referencją, która jest automatycznie tworzona przez wfetch
celu reprezentowania pobranego ref. Nie jest scalony, po prostu nadpisywany przy każdym pobieraniu.clean
to polecenie, które usuwa pliki, które nie są śledzonegit
,-df
flagi nakazują usunąć katalogi (-d
) i faktycznie usunąć (-f
).git clean -dn
przed użyciem,git clean -df
aby zobaczyć, które pliki / foldery zostaną usunięte.git clean -df
można cofnąć tylko, jeśli miałeś kopię zapasowągit clean -df
że usunę również pliki gitignored, ale okazuje się, że nie.git clean --help
mówi „Zwykle usuwane są tylko pliki nieznane Gitowi, ale jeśli podano opcję -x, usuwane są również pliki ignorowane. Może to na przykład być przydatne do usunięcia wszystkich produktów kompilacji”.Możesz spróbować:
(od Jak zmusić „git pull” do zastąpienia plików lokalnych? )
Innym pomysłem byłoby usunięcie całego gita i utworzenie nowego klonu.
źródło
Nie jestem pewien, jak to zrobić za pomocą jednego polecenia, ale możesz zrobić coś takiego:
lub nawet
źródło
git reset --hard && git pull
. Alternatywnie, ale nie lepiejgit reset --hard; git pull
. Użycie&&
spowoduje uruchomienie drugiego polecenia tylko wtedy, gdy pierwsze polecenie zakończyło się powodzeniem.;
uruchomi go niezależnie od kodu wyjścia pierwszego polecenia.Aby pobrać kopię gałęzi i wymusić zastąpienie plików lokalnych od źródła:
Cała bieżąca praca zostanie utracona, a wtedy będzie taka sama jak gałąź początkowa
źródło
źródło
Możesz zmienić zaczep, aby wyczyścić wszystko w czystości.
źródło
git clean
jest już „Usuń nieśledzone pliki z drzewa roboczego” (u góry strony). Zwykle nie obejmuje to plików ignorowanych, ale-x
nakazujegit clean
także dołączanie plików ignorowanych (z wyjątkiem tego, że nie wpływa to na pliki ignorowane przez-e
opcję).Jeśli nie zatwierdziłeś jeszcze zmian lokalnych od czasu ostatniego pobrania / klonowania, możesz użyć:
checkout
usunie twoje lokalne zmiany przy ostatnim zatwierdzeniu lokalnym ipull
sinkronizuje je do zdalnego repozytoriumźródło