Автоматическое удаление с помощью Git fetch или pull


248

Если кто-то удалил удаленную ветку, потому что работа закончена, и я не знаю, я не буду делать, git fetch --pruneи в конце концов я отодвину удаленную ветку.

Существует ли жизнеспособное решение для принудительного использования Git режима чернослива при извлечении / извлечении без необходимости каждый раз указывать его?


1
Вскоре (git 1.8.5, Q4 2013) вы сможете указать в локальном конфиге репо, который вы всегда хотите удалить git fetch! Смотрите мой ответ ниже
VonC

Ответы:


396

Начиная с git 1.8.5 (4 квартал 2013 года) :

« git fetch» (а значит и « git pull» также научился проверять « fetch.prune» и « remote.*.prune» переменные конфигурации и вести себя так, как если бы --pruneбыла задана опция командной строки « ».

Это означает, что если вы установите для remote.origin.prune значение true:

git config remote.origin.prune true

Любой git fetchили git pullавтоматически удалит.

Примечание: Git 2.12 (Q1 2017) исправит ошибку, связанную с этой конфигурацией, которая может привести к git remote renameнеправильной работе.
Смотрите « Как мне переименовать git remote? ».


Подробнее на коммите 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. Есть ли где-нибудь, где я могу поместить это в мой .gitconfig, чтобы это произошло?
Андрей

47
@ Андрей неплохо бы начать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

  Если true, fetch будет автоматически вести себя так, как если бы --pruneопция была задана в командной строке. Смотрите также remote.<name>.prune.

 

gui.pruneDuringFetch

  «true», если git-gui должен удалять ветви удаленного отслеживания при выполнении выборки. Значение по умолчанию неверно".

 

remote.<name>.prune

  Если установлено значение true, выборка с этого пульта по умолчанию также удалит все ссылки на удаленное отслеживание, которые больше не существуют на пульте (как если бы --pruneпараметр был задан в командной строке). Переопределяет fetch.pruneнастройки, если они есть.


1
Примечание стороны: я только что узнал о git config -eи git config -e --globalс этого поста. Больше не vimнужно вводить команды, указывающие на конкретный путь к файлу конфигурации git, и не нужно думать о том, что это за конкретный путь.
Ecbrodie

1
Теперь это ответ, с которым вы можете работать. Большое спасибо.
Себингель

Этот ответ довольно подробный, но его очень сложно прочитать из-за его форматирования. Я бы нашел "Всегда --prune для git fetch и git pull во всех ваших репозиториях Git: git config --global fetch.prune true" так же хорошо (со ссылкой на соответствующие документы).
Тибо Колас

19

Если вы хотите всегда, pruneкогда вы fetch, я могу предложить использовать псевдонимы .

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

[alias]
pfetch = fetch --prune   

Когда вы получите с git pfetchчерносливом будет сделано автоматически.


Я понимаю. Pull, кстати, будет использовать git fetch, а не git pfetch ... у меня должен быть псевдоним для pull?
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.