Jak sprawić, by Git pull używał domyślnie bazy danych dla wszystkich moich repozytoriów?

186

Czy istnieje sposób na skonfigurowanie repozytorium Git hosta w taki sposób, aby domyślnie git pullużywany --rebasebył dowolny z jego (lokalnych) klonów ? Przeszukując Przepełnienie stosu, dowiedziałem się o tym branch.autosetuprebase, ale trzeba go skonfigurować indywidualnie dla każdego klonu.

Moja przepływ projekt jest ustawiona taka, że pullten developoddział przed mergeing gałąź funkcji do niego. To pullprawie zawsze używa --rebase, więc próbuję dowiedzieć się, czy może to być ustawienie domyślne.

Zamaskowany mężczyzna
źródło
6
dlaczego tego chcesz? Myślę, że rozsądniej jest uczyć użytkowników, aby aktywnie zastanawiali się, który przypadek będzie bardziej odpowiedni (w oparciu o skalę zmian, których dokonali lub oczekują od wcześniejszych etapów) ”
Jonas Schäfer,
4
@JonasWielicki Tak, zgadzam się. Po prostu niektórzy członkowie mojego zespołu są nowi w Git i chciałbym wiedzieć, czy istnieje sposób, aby wymusić to, aby uniknąć problemów w początkowej fazie (dopóki się tego nie nauczą). Zespół pracuje również zdalnie w innej strefie czasowej, co oznacza, że ​​utkną na kilka godzin, jeśli coś pójdzie nie tak. Ciekawe, czy to możliwe.
Masked Man,
1
Myślę, że szczególnie w przypadku początkowych ustawień lepiej wybrać scalenie. Rebase robi znacznie dziwniejsze rzeczy, jeśli twój kod naprawdę się rozbiera. Musisz rozwiązywać te same konflikty w kółko, dopóki nie naciskasz. Więc jeśli członek zespołu chce pracować nad jakimś kodem, zawsze używa rebase i nie naciska, dopóki nie skończy (co mogą zrobić nowicjusze, zamiast się rozgałęziać), staną w obliczu tych samych konfliktów, które rozwiązali już X razy .
Jonas Schäfer,
3
@JonasWielicki Członkowie zespołu zrobić utworzyć nowy oddział dla każdej nowej funkcji pracują na (i to, że już całkiem dobrze rozumieć). Potrzebna jest rebase, ponieważ inni programiści zaangażowali się w „zdalną” gałąź rozwoju, zanim będzie gotowy do wprowadzenia zmian. Dlatego chciałbym, aby wykonał wyciąg z bazy zdalnie przed wprowadzeniem zmian. Sam projekt jest dość dojrzały, tylko zespół jest nowy. :) Więc jest to „wstępna konfiguracja” tylko pod względem ludzi. Jaka byłaby twoja rada dla tego scenariusza?
Masked Man,
5
Odpowiadając na Twój pierwszy komentarz, w większości przypadków (prawie we wszystkich), rebase jest właściwym wyborem, ponieważ dokładne sprawdzenie nowej funkcji zajmuje dużo czasu itp. Do tego czasu z pewnością będzie mnóstwo zmian od innych programistów.
Masked Man,

Odpowiedzi:

205

Istnieją teraz 3 różne poziomy konfiguracji domyślnego zachowania ściągania. Od najbardziej ogólnych do najbardziej drobnoziarnistych są to:

1. pull.rebase

Ustawienie tego na trueoznacza, że git pullzawsze jest równoważne git pull --rebase(chyba że branch.<branchname>.rebasejest to wyraźnie ustawione na false). Można to również ustawić dla repozytorium lub globalnie.

2) branch.autosetuprebase

Ustawienie tej wartości alwaysoznacza, że ​​za każdym razem, gdy tworzona jest gałąź śledzenia, zostanie dla niej utworzony wpis konfiguracji podobny do poniższego. Dla dokładniejszego szczegółową kontrolę, może to być również ustawiony never, localalbo remotei może być ustawiony za repozytorium lub globalnie. Zobacz git config --helpdalsze szczegóły.

3) branch.<branchname>.rebase

Ustawienie tej wartości trueoznacza, że ​​ta konkretna gałąź zawsze będzie pobierać od swojego źródła poprzez zmianę zasad, chyba że zostanie git pull --no-rebaseto użyte jawnie.

Wniosek

Więc chociaż nie możesz zmienić domyślnego zachowania dla wszystkich przyszłych klonów repozytorium, możesz zmienić domyślne dla wszystkich repozytoriów bieżącego użytkownika (istniejących i przyszłych) za pośrednictwem git config --global pull.rebase true.

Parker Coates
źródło
4
Dzięki za twoją odpowiedź. Badałem, czy mogę mieć takie ustawienie, aby każdy, kto klonuje repozytorium, miał je domyślnie włączone. Powyższe ustawienie zostanie zapisane ~/.gitconfig, co oznacza, że ​​każdy programista, który klonuje repozytorium hosta, musiałby uruchomić polecenie. Nie narzekam na twoje rozwiązanie. To jest dobre, chcę tylko potwierdzić, że poprawnie zrozumiałem twój punkt widzenia.
Masked Man,
Dziękuję za odpowiedź. Wygląda na to, że jest tak blisko, jak tylko się da.
Masked Man
139

Co powiesz na

git config --global pull.rebase true

To powie gitowi, by zawsze ciągnął z rebase.

mackuntu
źródło
3
Dzięki, działa to świetnie dla istniejących gałęzi śledzenia.
Fls'Zen
1
Proszę usunąć --bool, to nie jest konieczne
diralik
38

Odpowiedź brzmi nie.

Nie ma sposobu na skonfigurowanie zdalnego repozytorium, aby każdy, kto go klonuje, miał domyślne zachowanie git pullzmienione.

Możesz jednak ustawić hak po stronie serwera, który sprawdza, czy nikt nie popycha zatwierdzeń scalania ( być może coś takiego ).

Istnieją również opcje konfiguracji, które mogą Cię zainteresować. Wszyscy programiści, którzy sklonują się ze zdalnego repozytorium, będą musieli ustawić go samodzielnie.

1. Opcja branch.<name>.rebase

Możesz skonfigurować oddział lokalny, aby zawsze używał --rebase, tak jak to, zastępując <name>nazwę oddziału:

git config branch.<name>.rebase true

Po uruchomieniu to na master, na mastersekcję .git/configwyglądał następująco:

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2. Opcja branch.autosetuprebase

Uruchomienie poprzedniej komendy config dla każdej gałęzi Git może być kłopotliwe, więc możesz skonfigurować Git, aby automatycznie konfigurował ją dla każdej nowej gałęzi:

git config branch.autosetuprebase always

(Można również określić never, remotei localzobacz man git-configszczegóły.)

Bez tej --globalopcji konfiguracja jest zapisywana .git/configi dotyczy to tylko bieżącego repozytorium. Za --globalpomocą konfiguracja jest zapisywana ~/.gitconfigi dotyczy to każdego nieskonfigurowanego repozytorium.

Ta opcja nie wpływa na już istniejące oddziały.

3. Opcja pull.rebase

git config --bool pull.rebase true

(Możesz również dać taką --globalopcję).

Jeśli ta opcja jest prawdziwa, uruchamianie git pulljest równoważne git pull --rebase, chyba branch.<name>.rebaseże zostało ustawione na false.

Flimm
źródło
3

To sprawia, że --rebaseopcja ta jest domyślna podczas wydawania git pull w danym oddziale.

@Flimm, musiałem dodać, trueaby pierwsza opcja działała.

Tak więc poprawna składnia to:

git config branch.<branch>.rebase true

Aby uruchomić to polecenie w developoddziale:

git config branch.develop.rebase true

A teraz developsekcja .git/configwygląda następująco:

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true
Daishi
źródło
Dzięki, zredagowałem swoją odpowiedź, w przyszłości możesz ją edytować samodzielnie.
Flimm
2
Donwvoter, kimkolwiek jesteś, proszę wyjaśnij swoje powody. Głosowanie bez komentarza wydaje mi się całkowicie arbitralne i niekonstruktywne.
Daishi
1

Obecnie nie ma możliwości ustawienia domyślnych zasad dla repozytorium.

Jeśli chcesz go dla siebie i używasz przynajmniej git 1.7.9, możesz globalnie ustawić pull.rebasekonfigurację w następujący sposób:

git config --global pull.rebase true

Ale będziesz musiał zrobić na każdej maszynie. Jedną z opcji może być skonfigurowanie domyślnego domowego szablonu / szkieletu użytkownika za pomocą tej opcji. Użytkownicy mogą jednak zmienić tę opcję.

Jeśli nie chcesz łączenia, możesz zdefiniować przechwytywanie po stronie serwera, aby odrzucać wypychania z łączeniami.

Dla twojej wiedzy jest to dokumentacja źródłowa pull.rebase:

Gdy ma wartość true, rozłóż gałęzie na pobranej gałęzi, zamiast scalać gałąź domyślną z domyślnego pilota po uruchomieniu „git pull”. Zobacz „branch..rebase”, aby ustawić to dla poszczególnych oddziałów.

Podczas scalania należy przekazać opcję --rebase-scales, aby git rebase, tak aby lokalne zatwierdzenia scalania zostały uwzględnione w rebase (szczegóły w git-rebase ).

Kiedy zachowaj, przekaż także --preserve-scala się do git rebase, aby lokalnie zatwierdzone zatwierdzenia scalania nie zostały spłaszczone przez uruchomienie git pull.

Gdy wartość jest interaktywna, rebase jest uruchamiany w trybie interaktywnym.

UWAGA: jest to potencjalnie niebezpieczna operacja; nie używaj go, dopóki nie zrozumiesz implikacji (zobacz szczegóły w git-rebase ).

David
źródło