Powiedzmy, że współpracuję z kimś za pośrednictwem repozytorium git i istnieje konkretny plik, do którego nigdy nie chcę akceptować żadnych zmian zewnętrznych.
Czy jest jakiś sposób, abym skonfigurować lokalne repozytorium, aby nie narzekać na konfliktowe scalanie za każdym razem, gdy wyciągam? Chciałbym zawsze wybierać moją lokalną wersję podczas scalania tego pliku.
echo 'path/to/file merge=ours' >> .gitattributes && git config --global merge.ours.driver true
--global
znacznikiem. Jeśli chcesz to zachowanie tylko dla pojedynczego repozytorium, pomiń--global
flagę:echo 'path/to/file merge=ours' >> .gitattributes && git config merge.ours.driver true
Odpowiedzi:
W konkretnym przypadku pliku konfiguracyjnego zgodziłbym się z odpowiedzią Rona :
konfiguracja powinna być „prywatna” dla twojego obszaru roboczego (stąd „ignorowana”, jak w przypadku „zadeklarowanej w
.gitignore
pliku”).Możesz mieć szablon pliku konfiguracyjnego z tokenizowanymi wartościami i skrypt przekształcający ten
config.template
plik w prywatny (i ignorowany) plik konfiguracyjny.Jednak ta konkretna uwaga nie odpowiada na szersze, bardziej ogólne pytanie, tj. Twoje pytanie (!):
Ten rodzaj scalania to „scalanie kopii”, w którym zawsze kopiujesz „naszą” lub „ich” wersję pliku, gdy wystąpi konflikt.
W przypadku „pliku” (ogólnie pliku, nie mówiąc o pliku „konfiguracyjnym”, ponieważ jest to zły przykład), można to osiągnąć za pomocą niestandardowego skryptu wywoływanego przez scalanie.
Git wywoła ten skrypt, ponieważ będziesz musiał zdefiniować wartość gitattributes , która definiuje niestandardowy sterownik scalania .
„Niestandardowy sterownik scalania” jest w tym przypadku bardzo prostym skryptem, który zasadniczo zachowuje niezmienioną wersję bieżącej wersji, dzięki czemu można zawsze wybrać lokalną wersję.
Tj., Jak zauważył przez Ciro Santilli :
Przetestujmy to w prostym scenariuszu, z msysgit 1.6.3 w systemie Windows, w zwykłej sesji DOS:
Teraz stwórzmy dwa pliki, które będą miały konflikty, ale które zostaną scalone w inny sposób.
Wprowadzimy „konflikt” w zawartości obu tych plików w dwóch różnych gałęziach git:
Teraz spróbujmy połączyć „hisBranch” z „myBranch” z:
dirWithCopyMerge\b.txt
których zawsze chcę zachować moją wersjęb.txt
.Ponieważ scalanie następuje w „
MyBranch
”, wrócimy do niego i dodamygitattributes
dyrektywy „ ”, które dostosują zachowanie scalania.Mamy
.gitattributes
plik zdefiniowany wdirWithCopyMerge
katalogu (zdefiniowany tylko w gałęzi, w której nastąpi scalenie:)myBranch
i mamy.git\config
plik, który zawiera teraz sterownik scalania.Jeśli jeszcze nie zdefiniowałeś keepMine.sh i mimo to uruchomisz scalanie, oto co otrzymasz.
W porządku:
a.txt
jest gotowy do połączenia i ma w sobie konfliktb.txt
jest nadal nietknięty, ponieważ sterownik merge ma się tym zająć (ze względu na dyrektywę w.gitattributes
pliku w jego katalogu).Zdefiniuj
keepMine.sh
dowolne miejsce w swoim%PATH%
(lub$PATH
dla naszego znajomego Uniksa. Oczywiście robię oba: mam sesję Ubuntu w sesji VirtualBox)Jak skomentował przez lrkwz i opisane w „ Merge Strategies sekcji” z Dostosowywanie Git - Git Atrybuty można zastąpić skrypt z poleceniem powłoki
true
.Ale w ogólnym przypadku możesz zdefiniować plik skryptu:
keepMine.sh
(to był jeden prosty kierowca seryjnej;) (jeszcze prostsze w tym przypadku należy użyć
true
)(Jeśli chcesz zachować drugą wersję, wystarczy dodać przed
exit 0
linią:cp -f $3 $2
.To wszystko scalić kierowca wynos zachować wersję pochodzących z drugiej. oddział, nadpisując wszelkie zmiany lokalne)
Teraz spróbujmy ponownie scalić od początku:
Scalanie kończy się niepowodzeniem ... tylko dla pliku.txt .
Edytuj plik a.txt i opuść linię z „hisBranch”, a następnie:
Sprawdźmy, czy plik b.txt został zachowany podczas tego scalania
Ostatnie zatwierdzenie reprezentuje pełne scalenie:
(Wiersz zaczynający się od Merge to potwierdza)
Weź pod uwagę, że możesz zdefiniować, połączyć i / lub nadpisać sterownik scalający, tak jak Git:
<dir>/.gitattributes
(który znajduje się w tym samym katalogu, co dana ścieżka): będzie miał pierwszeństwo przed innymi.gitattributes
w katalogach.gitattributes
(który znajduje się w katalogu nadrzędnym), ustawi dyrektywy tylko wtedy, gdy nie zostały jeszcze ustawione$GIT_DIR/info/attributes
. Ten plik jest używany do nadpisywania ustawień w drzewie. Zastąpi<dir>/.gitattributes
dyrektywy.Przez „łączenie” rozumiem „zagregowany” sterownik wielokrotnego scalania.
Nick Green próbuje w komentarzach faktycznie połączyć sterowniki scalające: zobacz „ Łączenie pom za pomocą sterownika Python git ”.
Jednak, jak wspomniał w innym pytaniu , działa tylko w przypadku konfliktów (równoczesna modyfikacja w obu gałęziach).
źródło
cp -f $3 $2
Prawdopodobnie powinny być cytowane, tjcp -f "$3" "$2"
.PATH
(Unix lub WindowsPATH
). Ponieważ ten skrypt będzie interpretowany przez powłokę Unix bash lub przez powłokę MingWin bash MsysGit Windows, będzie on przenośny.Jak skomentował @ ciro-santilli, prosty sposób na użycie
.gitattributes
z jego ustawieniami:i włącz tę strategię za pomocą:
(Dodam to jako odpowiedź, aby uczynić ją bardziej widoczną, ale czyniąc z niej Wiki społeczności, aby nie próbować przekraczać kredytów użytkownika dla siebie. Proszę o głosowanie w górę jego komentarza pod Q, aby dać mu uznanie!)
źródło
:-)
).Mamy wiele plików konfiguracyjnych, których nigdy nie chcemy nadpisywać. Jednak .gitignore i .gitattributes nie działały w naszej sytuacji. Naszym rozwiązaniem było przechowywanie plików konfiguracyjnych w gałęzi configs. Następnie zezwól na zmianę plików podczas scalania git, ale natychmiast po scaleniu użyj opcji „git checkout branch -”. aby skopiować nasze pliki konfiguracyjne z gałęzi configs po każdym scaleniu. Szczegółowa odpowiedź na temat przepełnienia stosu tutaj
źródło