git remote prune - не показывало столько удаленных веток, сколько я ожидал - PullRequest
111 голосов
/ 28 октября 2010

со страницы руководства:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

Итак, я удалил кучу веток, используя

git push origin :staleStuff

и затем побежал

git remote prune origin

Однако только одна локальная ветвь была удалена. Некоторые из этих ветвей были созданы мной, некоторые сотрудниками. Означает ли это, что я не правильно отслеживал эти ветви?

1 Ответ

186 голосов
/ 28 октября 2010

Когда вы используете git push origin :staleStuff, он автоматически удаляет origin/staleStuff, поэтому, когда вы запустили git remote prune origin, вы удалили ветку, которая была удалена кем-то другим.Скорее всего, вашим коллегам теперь нужно запустить git prune, чтобы избавиться от удаленных веток.


Так что же делает git remote prune?Основная идея: локальные ветви (не отслеживающие ветви) не затрагиваются командой git remote prune и должны быть удалены вручную.

Теперь пример из реальной жизни для лучшего понимания:

У вас естьудаленный репозиторий с 2 ​​ветками: master и feature.Предположим, что вы работаете с обеими ветками, поэтому в результате у вас есть эти ссылки в вашем локальном репозитории (полные имена ссылок приведены во избежание путаницы):

  • refs/heads/master (короткое имя master)
  • refs/heads/feature (короткое имя feature)
  • refs/remotes/origin/master (короткое имя origin/master)
  • refs/remotes/origin/feature (короткое имя origin/feature)

Теперь типичный сценарий:

  1. Некоторые другие разработчики заканчивают всю работу над feature, объединяют ее в master и удаляют ветку feature изудаленный репозиторий.
  2. По умолчанию, когда вы делаете git fetch (или git pull), никакие ссылки не удаляются из вашего локального репозитория, поэтому у вас все еще есть все эти 4 ссылки.
  3. Вырешите очистить их и запустите git remote prune origin.
  4. git и обнаружите, что ветвь feature больше не существует, поэтому refs/remotes/origin/feature является устаревшей веткой , которую следует удалить.
  5. Теперь у вас есть 3 ссылки, включая refs/heads/feature, поскольку git remote prune не удаляет ссылки refs/heads/*.

Можно идентифицировать локальные ветви, связанные с удаленнымиотслеживание ветвей, по параметру конфигурации branch.<branch_name>.merge.Этот параметр на самом деле не требуется для работы чего-либо (возможно, кроме git pull), поэтому он может отсутствовать.

(обновлено с примером и полезной информацией из комментариев)

...