Моя ситуация такова ... кто-то, работающий с тем же репо, удалил ветку из своего локального и удаленного репо ...
У большинства людей, которые спрашивали об этой проблеме в Stack Overflow или других сайтах, есть проблема с ветвями, которые все еще отображаются в списке удаленных веток отслеживания git branch -a
внизу:
* master
develop
feature_blah
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
remotes/origin/random_branch_I_want_deleted
Однако в МОЕЙ ситуации ветвь, которой там не должно быть, является локальной:
* master
develop
feature_blah
random_branch_I_want_deleted
remotes/origin/master
remotes/origin/develop
remotes/origin/feature_blah
Когда я выполняю любое из следующего, оно не удаляется локально:
$ git prune
Я также попробовал:
$ git remote prune origin
$ git fetch --prune
Более полезная информация: когда я проверяю, git remote show origin
это выглядит так:
* remote origin
Fetch URL: utilities:homeconnections_ui.git
Push URL: utilities:homeconnections_ui.git
HEAD branch: master
Remote branches:
master tracked
develop tracked
feature_blah tracked
other123 tracked
other444 tracked
other999 tracked
Local branches configured for 'git pull':
develop merges with remote develop
feature_blah merges with remote other999
master merges with remote master
random_branch_I_want_deleted merges with remote random_branch_I_want_deleted
Local refs configured for 'git push':
develop pushes to develop (local out of date)
master pushes to master (up to date)
feature_blah pushes to feature_blah(up to date)
Обратите внимание, что это только в разделе под названием Local branches configured for 'git pull':
Почему?
git
remote-branch
gogogadgetinternet
источник
источник
git branch -d the_local_branch
x/y
) была небольшая разница : она была исправлена (см. Мой ответ ниже )Ответы:
Я не виню вас за то, что вы расстроены из-за этого. Лучший способ посмотреть на это. Существует потенциально три версии каждой удаленной ветви:
(например, удаленное хранилище на https://example.com/repo.git ,
refs/heads/master
)refs/remotes/...
)(например, локальное хранилище,
refs/remotes/origin/master
)(например, локальное хранилище,
refs/heads/master
)Давайте начнем с
git prune
. Это удаляет объекты , на которые больше нет ссылок, и не удаляет ссылки. В вашем случае у вас есть местное отделение. Это означает, что есть ссылка с именем,random_branch_I_want_deleted
которая относится к некоторым объектам, которые представляют историю этой ветви. Так что по определениюgit prune
не буду удалятьrandom_branch_I_want_deleted
. Действительно,git prune
это способ удалить данные, которые накопились в Git, но на которые ничего не ссылаются. В целом, это не влияет на ваш взгляд на какие-либо ветви.git remote prune origin
иgit fetch --prune
оба оперируют ссылками в разделеrefs/remotes/...
(я буду называть их удаленными ссылками). Это не влияет на местные филиалы.git remote
Версия полезна , если вы хотите , чтобы удалить удаленные ссылки под конкретный пульт ДУ. В противном случае эти двое делают одно и то же. Итак, короче,git remote prune
иgit fetch --prune
оперируй на номер 2 выше. Например, если вы удалили ветку с помощью веб-интерфейса git и больше не хотите, чтобы она отображалась в вашем локальном списке ветвей (git branch -r
), то эту команду вам следует использовать.Чтобы удалить локальную ветку, вы должны использовать
git branch -d
(или,-D
если она нигде не объединена). FWIW, нет команды git для автоматического удаления локальных ветвей отслеживания, если удаленная ветвь исчезает.источник
xargs git branch -D
, но учтите, что любые новые ветки, которые вы создали, но никогда не отправляли на сервер, будут удалены, поэтому действуйте осторожно:git branch -r | awk '{print $1}' | egrep -v -f /dev/fd/0 <(git branch -vv | grep origin) | awk '{print $1}'
packed-refs
Файл в этой.git
области), поэтому не обязательно просто удалить их через проводник. Лучше использовать команды, чтобы убедиться, что оба позаботились правильно.git remote prune
иgit fetch --prune
сделайте то же самое: удалите ссылки на несуществующие ветви, как вы сказали. Вторая команда подключается к удаленному и выбирает его текущие ветви перед удалением.Однако это не затрагивает местные филиалы, которые вы проверили, которые вы можете просто удалить с помощью
Заменить
-d
на,-D
если ветка не объединена в другом местеgit prune
делает что-то другое, он очищает недоступные объекты, те коммиты, которые недоступны ни в одной ветви или теге, и, следовательно, больше не нужны.источник
git prune
ищет не только ветки и теги, но и все другие ссылки.git remote prune
)В том случае, если кому-то будет интересно. Вот быстрый сценарий оболочки, который удалит все локальные ветви, которые не отслеживаются удаленно. Предупреждение: это избавит от любой ветви, которая не отслеживается удаленно, независимо от того, была ли она объединена или нет.
Если вы, ребята, видите какие-либо проблемы с этим, пожалуйста, дайте мне знать, и я исправлю это (и т.д. и т. Д.)
Сохраните его в файле с именем
git-rm-ntb
(называйте как угодно)PATH
и запустите:git-rm-ntb <remote1:optional> <remote2:optional> ...
источник
Следует отметить , что одно различие между
git remote --prune
иgit fetch --prune
в настоящее время фиксируется с фиксацией 10a6cc8 , от Тома Миллера (tmiller
) (для мерзавца 1.9 / 2.0, Q1 2014):Итак: когда в восходящем репо есть ветвь («frotz») с тем же именем, что и в иерархии ветвей («frotz / xxx», возможное соглашение об именах ветвей ), это
git remote --prune
было успешно (при очистке удаленной ветки отслеживания из вашего репо) , ноgit fetch --prune
терпел неудачу.Уже нет:
источник