Як змусити Git pull використовувати rebase за замовчуванням для всіх моїх сховищ?


186

Чи є спосіб налаштувати хост-сховище Git таким, щоб будь-який git pullзроблений з його (локальних) клонів використовував --rebaseза замовчуванням? Шукаючи на переповнюванні стека, я дізнався про branch.autosetuprebase, але це потрібно налаштувати на клон окремо.

Мій потік проекту встановлюється такий , що ми pullв developгалузі , перш за mergeІНГ гілка функції до нього. Це pullмайже завжди використовується --rebase, тому я намагаюся з'ясувати, чи може це бути за замовчуванням.


6
Чому ти цього хочеш? Я думаю, що більш розумно навчити користувачів активно думати про те, який випадок буде більш підходящим (виходячи з масштабів змін, які вони внесли чи очікують від висхідного потоку) '
Jonas Schäfer

4
@JonasWielicki Так, я згоден. Просто деякі з моїх членів команди новачки в Git, і я хотів би знати, чи є спосіб застосувати його, щоб уникнути проблем на початковій фазі (поки вони не засвоїли це). Команда також працює віддалено в іншому часовому поясі, а це означає, що вони затримаються на кілька годин, якщо щось піде не так. Просто цікаво дізнатися, чи це можливо.
Людина в масках

1
Я думаю, що особливо для початкових налаштувань краще піти на злиття. Rebase робить набагато дивніші речі, якщо ваш код дійсно розходяться. Ви повинні вирішувати одні і ті ж конфлікти знову і знову, поки не натиснете. Тож якщо член команди хоче працювати над деяким кодом, завжди використовує ребазування і не натискає, поки він не зробить (що можуть зробити новачки, а не розгалужувати себе), вони зіткнуться з тими ж конфліктами, які вони вирішили вже X разів .
Йонас Шефер

3
@JonasWielicki Члени команди роблять створити нову гілку для кожної нової функції вони працюють (і це, вони вже зрозуміли , дуже добре). Необхідність оновлення виникає через те, що інші розробники взяли на себе зобов’язання "віддаленого" відділення розробки до моменту, коли він готовий просунути свої зміни. Отже, я хотів би, щоб він здійснив перезавантаження з дистанційного, перш ніж висувати його зміни. Сам проект досить зрілий, тільки команда нова. :) Так що це "початкова установка" лише з точки зору людей. Що б ви порадили для цього сценарію?
Людина в масках

5
Відповідаючи на ваш перший коментар, у більшості випадків (майже у всіх) перезавантаження - це правильний вибір, оскільки для ретельного випробування нової функції потрібно багато часу і т. Д. До цього часу, безумовно, було б безліч комісій від інших розробників.
Людина в масках

Відповіді:


205

Зараз існує 3 різних рівня конфігурації для поведінки потягу за замовчуванням. Від найбільш загальних до найбільш дрібнозернистих вони:

1. pull.rebase

Встановити це trueозначає, що git pullзавжди еквівалентно git pull --rebase(якщо branch.<branchname>.rebaseявно не встановлено false). Це також можна встановити для сховища або глобально.

2. branch.autosetuprebase

Якщо це встановити, це alwaysозначає, що щоразу, коли буде створена гілка відстеження, для неї буде створена запис конфігурації, подібна до наведеної нижче. Для більш тонкого зернистого контролю це також може бути встановлено never, localабо remoteможе бути встановлено для сховища або глобально. Детальнішу git config --helpінформацію див.

3. branch.<branchname>.rebase

Якщо встановити це, trueозначає, що ця конкретна гілка завжди буде витягуватись зі своєї верхівки за допомогою скидання, якщо тільки git pull --no-rebaseне використовується явно.

Висновок

Таким чином, хоча ви не можете змінити поведінку за замовчуванням для всіх майбутніх клонів репозиторію, ви можете змінити типово для всіх сховищ поточного користувача (існуючих та майбутніх) сховищ через git config --global pull.rebase true.


4
Дякую за Вашу відповідь. Я досліджував, чи можу я мати налаштування, щоб кожен, хто клонував сховище, включив його за замовчуванням. Вищевказане налаштування буде зберігатися в ~/.gitconfig, тобто кожен розробник, який клонує хост-сховище, повинен запустити команду. Не скаржиться на своє рішення. Це добре, я просто хочу підтвердити, що я правильно зрозумів вашу думку.
Людина в масках

Дякую за відповідь. Дійсно, схоже, що це так близько, як можна дістатися.
Людина в масках

139

Як щодо

git config --global pull.rebase true

Це дозволить git завжди тягнути за допомогою rebase.


3
Дякуємо, це чудово підходить для існуючих гілок стеження.
Fls'Zen

1
Видаліть --bool, зайве
diralik

38

Відповідь - ні.

Існує не спосіб налаштувати віддалене сховище, щоб усі, хто його клонував, мали поведінку за замовчуванням git pull змінив .

Однак ви можете встановити гачок на стороні сервера, який перевіряє, чи ніхто не натискає на злиття чинів ( щось подібне можливо, ).

Також деякі варіанти конфігурації можуть вас зацікавити. Усі розробники, які клонують з віддаленого сховища, повинні самі встановити його вручну.

1. Варіант branch.<name>.rebase

Ви можете налаштувати локальну гілку так, щоб завжди її використовувати --rebase, замінюючи <name>її ім'ям:

git config branch.<name>.rebase true

Після запуску цього на master, в masterрозділі .git/configвиглядає наступним чином :

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

2. Варіант branch.autosetuprebase

Запустивши цю попередню команду config для кожної гілки Git, це може бути клопотом, тому ви можете налаштувати Git для автоматичного налаштування його для кожної нової гілки:

git config branch.autosetuprebase always

(Ви можете також вказати never, remoteі local, смman git-config подробиці.)

Без цього --globalпараметра конфігурація зберігається .git/config, і впливає лише поточне сховище. З --global, конфігурація зберігається в~/.gitconfig , і це впливає на все неконфігуроване сховище.

Цей варіант не стосується вже існуючих гілок.

3. Варіант pull.rebase

git config --bool pull.rebase true

(Ви також можете дати йому --globalможливість.)

Якщо ця опція вірна, то біг git pullеквівалентний git pull --rebase, якщо branch.<name>.rebaseне встановлено значення false.


3

Це робить --rebaseопцію за замовчуванням при видачіgit pull даної гілки.

@Flimm, мені потрібно було додати true щоб ваш перший варіант працював.

Тож правильний синтаксис такий:

git config branch.<branch>.rebase true

Для запуску цієї команди на developгілці:

git config branch.develop.rebase true

А тепер developрозділ .git/configвиглядає приблизно так:

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

Дякую, я відредагував свою відповідь, надалі сміливо редагуйте відповідь.
Флейм

2
Donwvoter, ким би ви не були, будь ласка, поясніть свої причини. Відмова без коментарів здається мені абсолютно довільною та неконструктивною.
Даїші

1

В даний час немає можливості встановити політику за замовчуванням для сховища.

Якщо ви цього хочете для себе і використовуєте принаймні git 1.7.9, ви можете глобально встановити pull.rebaseконфігурацію так:

git config --global pull.rebase true

Але вам доведеться робити на кожній машині. Одним із варіантів може бути налаштування домашнього шаблону / каркаса за замовчуванням за допомогою цього параметра. Однак користувачі можуть змінити цю опцію.

Якщо ви не хочете злиття, ви можете визначити гачок на стороні сервера для відхилення натискань злиттями.

Для довідки, його - це вихідна документація для pull.rebase:

Якщо це правда, перезавантажте гілки на верхній частині отриманої гілки, замість того, щоб об'єднувати гілку за замовчуванням із віддаленим за замовчуванням, коли виконується "git pull". Див. "Відділення..результат", щоб встановити це на основі гілки.

Під час злиття передайте параметр --rebase-merges для git rebase, щоб локальні комірки злиття були включені в ребазу (див. Git-rebase ).

Під час збереження також пропустіть - зберегти-злиття разом з git rebase, щоб локально здійснені об'єднання об'єднань не були згладжені запуском git pull.

Коли значення є інтерактивним, відновлення запускається в інтерактивному режимі.

ПРИМІТКА: це, можливо, небезпечна операція; не використовуйте його, якщо ви не розумієте наслідки (детальніше див. git-rebase ).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.