Jak mogę bezpiecznie zaktualizować (wyciągnąć) projekt git, zachowując określone pliki nietknięte, nawet jeśli wystąpią zewnętrzne zmiany?
myrepo / config / config.php
Czy jest sposób, nawet jeśli ten plik był zmieniany zdalnie, kiedy git pull, wszystko inne jest aktualizowane, ale ten plik jest niezmieniony (nawet nie scalony)?
PS. Muszę zrobić to, o co proszę, ponieważ piszę tylko skrypty wdrażania oparte na git. Nie mogę zmienić plików konfiguracyjnych na szablony.
potrzebuję więc sposobu na pisanie skryptów aktualizacyjnych, które nie tracą tego, co zostało lokalnie zmienione. Liczyłem na coś tak prostego, jak:
git assume-remote-unchanged file1
git assume-remote-unchanged file2
następnie git pull
config.php
?Odpowiedzi:
Istnieje proste rozwiązanie oparte na skrytce Gita. Schowaj wszystko, co zmieniłeś, wyciągnij wszystkie nowe rzeczy, zastosuj swoją skrytkę.
W przypadku stash pop mogą wystąpić konflikty. W przypadku, gdy opisujesz, faktycznie wystąpiłby konflikt o
config.php
. Ale rozwiązanie konfliktu jest łatwe, ponieważ wiesz, że to, co wkładasz do skrytki, jest tym, czego chcesz. Więc zrób to:źródło
git merge
„naszym” jest to, co aktualnie znajduje się w katalogu roboczym. Ale dlagit rebase
(lubgit rebase -onto
) znaczenie można zamienić.git stash , git pull , git stash apply
Możesz upuścić skrytkę za pomocą:git stash drop
Po pomyślnym scaleniu zmiangit stash
.Jeśli masz w repozytorium plik, który powinien być dostosowany przez większość ściągaczy, zmień nazwę pliku na podobną
config.php.template
i dodajconfig.php
do.gitignore
.źródło
.gitattributes
aby zawsze zachować zmiany podczas scalania.Aktualizacja: to dosłownie odpowiada na zadane pytanie, ale myślę, że odpowiedź KurzedMetal jest naprawdę tym, czego chcesz.
Przy założeniu, że:
master
master
worigin
.... mógłbyś:
Możesz utworzyć dla tego alias, jeśli chcesz to robić często. Zwróć uwagę, że jeśli masz niezatwierdzone zmiany w programie
config/config.php
, spowoduje to ich odrzucenie.źródło
Możemy również spróbować git pull z rebase
źródło
Aby odpowiedzieć na pytanie: jeśli chcesz wykluczyć niektóre pliki z kasy, możesz użyć sparse-checkout
1) W
.git/info/sparse-checkout
, określ, co chcesz zatrzymać. Tutaj chcemy all (*) ale (zwróć uwagę na wykrzyknik) config.php:2) Powiedz gitowi, że chcesz wziąć pod uwagę rzadkie płatności
3) Jeśli masz już ten plik lokalnie, zrób to, co robi git przy rzadkim pobieraniu (powiedz mu, że musi wykluczyć ten plik, ustawiając na nim flagę "skip-worktree")
4) Korzystaj z repozytorium, w którym plik config.php należy do Ciebie - niezależnie od zmian w repozytorium.
Zauważ, że gdy plik zostanie przejęty przez git, .gitignore nie przyniesie żadnego efektu.
Biorąc pod uwagę, że gdy plik jest pod kontrolą źródła, masz tylko dwie możliwości (): - ponownie bazuj całą historię, aby usunąć plik (za pomocą
git filter-branch
) - utwórz zatwierdzenie, które usunie plik. To jak staczanie przegranej bitwy, ale cóż, czasami trzeba z tym żyć.źródło
Uwzględnij ich lokalne niezatwierdzone zmiany i unikaj konfliktów scalania podczas ciągnięcia.
refer - https://happygitwithr.com/pull-tricky.html
źródło