Автоматична чорнослив з Git fetch або pull


248

Якщо хтось видалив віддалену гілку, тому що робота закінчена, і я не знаю, я цього не зроблю git fetch --pruneі, врешті-решт, я відсуну вилучену гілку.

Чи є життєздатне рішення змусити Git використовувати режим чорносливу під час отримання / витягування без необхідності кожного разу вказувати його?


1
Ви незабаром (git 1.8.5, Q4 2013) зможете вказати в локальному конфігурації репо, на яке завжди хочете підрізати git fetch! Дивіться мою відповідь нижче
VonC

Відповіді:


396

З git 1.8.5 (Q4 2013) :

" git fetch" (отже, " git pull" також) навчився перевіряти " fetch.prune" і " remote.*.prune" змінні конфігурації та поводитись так, ніби " --prune" надано параметр командного рядка.

Це означає, що, якщо ви встановили remote.origin.prune на істинне:

git config remote.origin.prune true

Будь-який git fetchабо git pullавтоматично підріже.

Примітка: Git 2.12 (Q1 2017) виправить помилку, пов’язану з цією конфігурацією, яка призведе до git remote renameнеправильного поводження.
Див. " Як мені перейменувати пульт дистанційного керування? ".


Дивіться більше на комісії 737c5a9 :

Без " git fetch --prune" гілок віддаленого відстеження для гілки, яку вже видалила інша сторона, залишиться назавжди.
Деякі люди хочуть завжди бігати " git fetch --prune".

Щоб розмістити користувачів, які хочуть завжди обрізати або під час отримання певного віддаленого пристрою, додайте дві нові змінні конфігурації " fetch.prune" і " remote.<name>.prune":

  • " fetch.prune" дозволяє ввімкнути чорнослив для всіх операцій з вилученням.
  • " remote.<name>.prune" дозволяє змінювати поведінку на відстань.

Останній, природно, замінить перший, а --[no-]pruneпараметр з командного рядка замінить налаштований за замовчуванням.

Оскільки --pruneце потенційно руйнівна операція (Git ще не зберігає рефлекторії для видалених посилань), ми не хочемо обрізати без згоди користувачів, тому ця конфігурація не буде включена за замовчуванням.


4
Це дійсно включено у щойно випущений git 1.8.5
Bessey

1
Я хочу, щоб ця поведінка була за замовчуванням у всіх моїх git repos. Чи є десь я можу це помістити у свій .gitconfig, щоб це відбулося?
Андрій

47
@Andrew вдалий початокgit config --global fetch.prune true
VonC,

1
які можливі недоліки завжди підрізати на тязі? цитата згадує, що історія рефлогу зачіпається ... але яку практичну проблему це може спричинити?
Графо

3
@Grapho без реального погіршення , але ... більше на stackoverflow.com/a/39862779/6309
VonC

143

git config --global fetch.prune true

Щоб завжди --pruneдля git fetchі git pullу всіх репозиторіях Git:

git config --global fetch.prune true

Ця вище команда додає до вашої глобальної конфігурації Git (як правило ~/.gitconfig) наступні рядки. Використовуйте git config -e --globalдля перегляду вашої глобальної конфігурації.

[fetch]
    prune = true

git config remote.origin.prune true

Щоб завжди, --pruneале з одного єдиного сховища:

git config remote.origin.prune true
                 #^^^^^^
                 #replace with your repo name

Ця вище команда додає у локальній конфігурації Git (як правило .git/config) нижній останній рядок. Використовуйте git config -eдля перегляду локальної конфігурації.

[remote "origin"]
    url = xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
    fetch = +refs/heads/*:refs/remotes/origin/*
    prune = true

Ви також можете використовувати --globalв межах другої команди або використовувати замість неї --localв межах першої команди.


git config --global gui.pruneDuringFetch true

Якщо ви користуєтесь, git guiвас також можуть зацікавити:

git config --global gui.pruneDuringFetch true

що додається:

[gui]
    pruneDuringFetch = true

Список літератури

Відповідні документації git help config:

--global

  Параметри написання: пишіть у глобальний ~/.gitconfigфайл, а не в сховище .git/config, пишіть у $XDG_CONFIG_HOME/git/configфайл, якщо цей файл існує, а ~/.gitconfigфайл - ні.

 

--local

  Параметри написання: запишіть у .git/configфайл сховища . Це поведінка за замовчуванням.

 

fetch.prune

  Якщо це правда, вимкнення автоматично поводитиметься так, ніби --pruneопція була задана в командному рядку. Дивіться також remote.<name>.prune.

 

gui.pruneDuringFetch

  "вірно", якщо git-gui повинен обрізати гілки віддаленого відстеження при виконанні вибору. Значення за замовчуванням "false".

 

remote.<name>.prune

  Якщо встановлено значення true, вилучення з цього віддаленого за замовчуванням також видалить будь-які посилання віддаленого відстеження, які більше не існують на віддаленому пристрої (як якщо б --pruneопція була задана в командному рядку). Переорієнтовує fetch.pruneналаштування, якщо такі є.


1
Бічна примітка: Я щойно дізнався про цю публікацію git config -eта git config -e --globalз неї. Немає більше vimкоманд набору тексту для вказівки на певний шлях до файлу конфігурації git та думати про те, що це за конкретний шлях.
ecbrodie

1
Тепер ЦЕ відповідь, з якою можна працювати. Велике спасибі.
себінгель

Ця відповідь досить ґрунтовна, але її важко читати через її форматування. Я знайшов би "Завжди --prune for git fetch and git pull у всіх ваших сховищах Git: git config --global fetch.prune true" так само добре (із посиланням на відповідні документи).
Тібо Колас

19

Якщо ви хочете завжди, pruneколи ви fetch, я можу запропонувати використовувати Псевдоніми .

Просто введіть, git config -eщоб відкрити редактор та змінити конфігурацію для конкретного проекту та додати розділ типу

[alias]
pfetch = fetch --prune   

коли ви git pfetchотримаєте чорнослив, буде зроблено автоматично.


Я розумію. Натягніть до речі, ви будете використовувати git fetch, а не git pfetch ... чи повинен я безпосередньо мати псевдонім для тягнути?
Edmondo1984

1
Я буду. Таким чином , у вас є обидва варіанти, нормальна pullі fetchта їх обріжуть версію. Насправді, я думаю (але я не намагався), ви можете писати fetch = fetch --pruneбезпосередньо в розділі псевдоніму, і тому pullавтоматично використовуватиме обрізаний
фетр

2
Наскільки я знаю, fetch = fetch --pruneце не працює, перезапис команди з псевдонімом не працював для мене. Це може бути тому, що я використовую стару версію (1.7.2.5)
Uipko

3
З документації git config: "Щоб уникнути плутанини та проблем із використанням сценарію, псевдоніми, які приховують існуючі команди Git, ігноруються."
Девейн Крістенсен
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.