Как правильно использовать Git для очистки устаревших веток? - PullRequest
0 голосов
/ 10 июня 2018

Если я запускаю git fetch --all --prune, это удаляет устаревшие ветки локально или сначала извлекает все ветви из клонов, а затем выполняет очистку.
Я заметил случай, когда я сделал git push --delete origin some_branch с машины, а затем, когда веще один завершенный экземпляр после выполнения git fetch --all --prune и затем git pull ветвь все еще была там.
Я не понимаю этого поведения, как правильно очистить устаревшие ветки?

1 Ответ

0 голосов
/ 10 июня 2018

Во-первых, имейте в виду, что --all в git fetch означает все пульты , а не все ссылки .То есть, если у вас обычный единственный пульт с именем origin, --all вообще ничего не делает.

Далее, имейте в виду разницу между именем ветви - именем вrefs/heads/, например refs/heads/master - и имя удаленного отслеживания , иногда называемое имя удаленного отслеживания , которое является ссылкой под refs/remotes/, за которым следует имяудаленного.--prune делает, чтобы удалить имена удаленного отслеживания, которые не имеют соответствующего имени на конкретном пульте.

Что обычно делает git fetch:

  1. Вызвать Git наURL-адрес, сохраненный в этом пульте, например, из git config --get remote.origin.url при извлечении из origin.
  2. Пусть они перечислят свои ссылочные имена (запустите git ls-remote, чтобы увидеть их).
  3. Обратитесь к этому Git для получения объектов Git - в основном, для фиксации объектов, но любые объекты из выходных данных на шаге 2 являются кандидатами - которые у них есть, а у нас нет, которых мы хотим (основываясь на любых дополнительных аргументах, данных git fetch,или настроенный параметр).
  4. Наконец, после получения всех объектов, создайте или обновите локальные имена, как правило, в форме refs/remotes/<em>remote</em>/<em>name</em>, основываясь на именах ветвей, которые видны на этом пульте.Но смотрите ниже, потому что у этого шага есть сложности.

    Именно во время этого обновления ваш Git может удалить некоторые из этих имен удаленного отслеживания, если вы включили сокращение (через --pruneили варианты конфигурации).Это все задолго до того, как git pull, который запускает git fetch, за которым следует вторая команда Git, может выполнить вторую команду Git.

Последняя, ​​обратите внимание, что для --prune работаетправильно, вам нужна типичная настройка remote.<em>remote</em>.fetch, например, remote.origin.fetch будет читать +refs/heads*:refs/remotes/origin/*, а затем git fetch --prune удалит из вашего собственного хранилища refs/remotes/origin/xyzzy, если в хранилище Git нет refs/heads/xyzzyна remote.origin.url.Если вы сделали клон --single-branch, строка remote.origin.fetch будет иметь различное содержимое, а --prune будет неэффективным.

Учитывая то, что вы наблюдали, вполне вероятно, что у вас был нестандартный параметр remote.origin.fetchвероятно, из-за того, что создал клон как клон с одной ветвью.

...