2010-10-05 10 views
46

Mam dwie gałęzie, A i B. Oddział A ma katalog examples z niektórymi plikami, które są śledzone przez git, a te pliki powinny nie pojawiają się na gałęzi B. W moim przepływie pracy często łączę zmiany wprowadzone w A w B, co jest problemem za każdym razem, gdy są pewne zmiany na examples. Na razie robię to ręcznie: kasowanie plików po scaleniu lub rozwiązywanie konfliktów, gdy nastąpiła zmiana w pliku, który już usunąłem.Git: zignoruj ​​niektóre pliki podczas scalania (zachowaj niektóre pliki ograniczone do jednego oddziału)

Czy można zignorować te pliki podczas scalania? (Czy jest to możliwe, aby zachować niektóre pliki ograniczone do jednej gałęzi (A) lub od jednej gałęzi (B)?)


Pozwól mi spróbować wyjaśnić, dlaczego to robię: A jest szkielet blog (szablon, skrypty itp.), B to mój blog (A wypełniony własnymi postami, obrazami, wersjami roboczymi itp.). A jest publiczny i staram się, aby był on ogólny dla innych osób, które wyglądają i używają go, ale z tego powodu potrzebuję kilku postów jako prezentacji/testów (katalog examples). Każda zmiana w A i później jest scalana w B, aby to zmienić w moim wystąpieniu bloga - w ten sposób wszystkie nowe przykłady pojawiają się w B i wszystkie usunięte przykłady w B, które zostały zmienione w A, ponieważ ostatnie scalenie powoduje konflikt.

+0

Wygląda na to, że coś jest nie tak w twoim przepływie pracy. Czy myślałeś o użyciu submodułów git zamiast? – mb14

+0

Zmieniłem moje pytanie wyjaśniające, dlaczego to robię. Nie mam doświadczenia z submodułami. Czy to nadaje się do tego? – dbarbosa

+0

Właściwie @Lestat, itd. To zdecydowanie nie jest duplikat # 928646, ponieważ to pytanie dotyczy "konfliktów scalonych", podczas gdy tutaj "wszystko się scala". W tym przypadku nie są wywoływane żadne sterowniki scalające, co powoduje zmniejszenie zalecanego sposobu obsługi różnic między plikami, gdy występują konflikty: używanie sterowników scalania. Czy to pytanie może być niedokładne? –

Odpowiedz

3

Polecenie git może być przydatne przy użyciu polecenia rerere. Dzięki temu możesz nagrywać rezolucje dotyczące niektórych konfliktów scalania i ponownie używać ich później.

+2

Próbowałem to zrobić: http://progit.org/2010/03/08/rerere.html Ale to nie działa ... Po konflikcie, 'git rerere status' i' git rerere diff' doesn nic nie pokazują. Już sprawdziłem i to jest w moim ~/.gitconfig, utworzyłem katalog .git/rr-cache w moim repozytorium ... W każdym razie, widzę, że to zadziała w przypadku zmiany plików w 'przykłady' na' A'. Czy to też działa w przypadku nowych plików? (jeśli w pliku 'examples' zostanie utworzony nowy plik, scalenie tego pliku nie spowoduje konfliktu - plik zostanie dodany do' B'). – dbarbosa

1

Wraz z aktualizacjami: Tak, submoduły byłyby odpowiednie do tego zastosowania, jeśli wszystkie litery A mieszczą się w podkatalogu B (lub odwrotnie). Przykładem submodułów używających WordPressa byłoby posiadanie repozytorium git Wordpress; można dodać moduł podrzędny dla tematu, który znajduje się w katalogu /wp-content/themes/.

Pomocne może być documentation for submodules.

Jeśli pliki z dwóch są przeplatane, może być trudniejsze. W większości przypadków, gdy można zastosować w ten sposób podmodulki, aplikacja, o której mowa, została zaprojektowana, aby im umożliwić.

49

znalazłem dobrą odpowiedź tutaj: stackoverflow Q332528

Wykorzystuje pomysły zaczerpnięte z tutaj: Pro-Git merge strategies

Oto kopia:

Powiedzmy chcesz wykluczyć plik config.php

Na oddziale A:

  1. Utwórz plik o nazwie ".gitattributes" w tym samym katalogu, z tą linią : config.php merge = ours. To mówi, jaką strategię użyć podczas łączenia pliku. W takim przypadku zawsze zachowujesz swoją wersję, tj. wersja w oddziale, w którym się łączysz.

  2. Dodaj.Plik gitattributes i zobowiązać

na oddział B: powtórz kroki 1-2

Spróbuj łączenia teraz. Twój plik powinien pozostać nietknięty.


Edit:
Z git book dotyczące merge=ours „Jeden bardzo przydatna opcja jest powiedzieć Git nie spróbować połączyć konkretne pliki kiedy mają konflikty, ale raczej korzystać z boku łączyć się z kimś innym. "

Tak więc ta odpowiedź nie ma zastosowania tak jak może na pytanie. pjmorse's answer dotyczące korzystania z submodułów jest dobre.

Inną opcją byłoby użycie a sub-tree merge, która mogła mieć dodatkowe korzyści.

+3

Nie działało to dla mnie, niezależnie od tego, czy umieściłem linię myfile = ours w .gitattributes lub .git/info/attributes. Jak rozumiem, nie ma konfliktu między nowym plikiem a żadnym plikiem, więc nie ma problemu ze strategią: kiedy scalam, plik, który chcę wykluczyć, pojawia się jako "nowy plik: mój plik" w "Zmiany do zatwierdzenia". – skierpage

+1

To prawda, działa to tylko wtedy, gdy masz już własną wersję pliku (plików) zatwierdzonych. Zmontowałem i dodałem trochę informacji. – David

+3

Jest zaktualizowany [artykuł] (https://git-scm.com/book/uz/v2/Customizing-Git-Git-Attributes), który stwierdza, że ​​będziesz musiał również zadeklarować strategię scalania naszą przez '$ git config - -global merge.ours.driver true' – dag

Powiązane problemy