2014-01-23 3 views
3

У меня есть куча удаленных ветвей, которые были удалены, и теперь я хочу удалить ветви локально. Я пробовал:git fetch prune не работает

git fetch -p

, но он не работает.

Если я:

git branch -r

и

git branch

списки не совпадают, потому что git branch еще списки удаляются удаленные ветви, даже после того, как я бегу git fetch -p. Я видел это как принятый ответ, чтобы сделать это в целом ряде вопросов, но это не работает для меня.

Я не уверен, что правильно сформулировал проблему, поэтому вот еще одно объяснение.Скажем, у меня есть:

GitHub: (дистанционный)
        Ответвление А
        Отделение Б
        Отделение С

Местное:
        Ответвление А ==> (дистанционный) ветви А
        ветви В ==> (дистанционный) Отделение Б
        Отделение C ==> (дистанционный) Отделение С

Теперь кто-то удаляет ветку на GitHub, что дает:

GitHub: (дистанционный)
        Ответвление А
        Отделение C

То, что я хочу, чтобы мой местный репо выглядеть является:

Местно:
        Branch A ==> (удаленный) Филиал А
        Branch C ==> (дистанционный) Отделение C

+0

Вы выбираете правильный пульт? Предполагая 'origin', попробуйте' git fetch -p origin'. – Chris

+0

Если 'git branch' (без' -r') перечисляет их, они не являются удаленными ветвями. – hobbs

ответ

10

Для расширения hobbs' comment, git fetch -p (или git remote prune или любая аналогичная команда) удаляет из вашего репозитория всю «удаленную ветку», которая больше не присутствует на пульте дистанционного управления.

Если вы сделали филиал, эта метка не исчезнет, ​​если вы не удалите ее вручную.

Например, предположим, что на удаленном origin, была ветка по имени sparkly:

$ git fetch 
... 
* [new branch]  sparkly -> origin/sparkly 

Вы не имеют ветвь с именем sparkly в этой точке; (если вы уже был один!) вы только имеют origin/sparkly (который живет в отдельном пространстве имен, refs/remotes/, а не refs/heads/).

Если вы создали свою собственную ветку с именем sparkly ранее, возможно, она не отслеживает этот новый origin/sparkly. Если вы создадите свой собственный филиал с именем sparklyсейчас, он будет отслеживать origin/sparkly.

В обоих случаях ничто не удалит его автоматически. Вы должны сделать это вручную.

Одна из причин, почему: нет никакой гарантии, что только потому, что origin/sparkly ушел, вы сделали с ним («он» является местное отделение вы создали, которые могут или не могут отслеживать этот удаленный филиал). Если git удалил вашу метку вместе с версией origin/, любые фиксации, над которыми вы работали, могут стать очень трудными для поиска.

Итак, короткий ответ: вам придется делать это вручную (или полу-вручную, вы можете автоматизировать его столько, сколько хотите). Использование:

git branch -d sparkly 

удалить его, только если это "безопасно" (по мнению :-) GIT в), или:

git branch -D sparkly 

удалить его, даже если мерзавец считает, что это "небезопасно".

4

"забыть" локально, удаленные удаленные филиалы вы могли бы сделать

git remote prune myRemote 

(Edit взять комментарий в счет)

Теперь, чтобы удалить локальные ветви, а вы могли бы сделать

remote=origin 

for branch in $(git branch | sed 's/\*//'); do       
    if [ -z "$(git branch --all | grep $remote | grep $branch)" ]; then 
    git branch -D $branch 
    fi                  
done      

Если вы планируете сделать этот вид манипуляции часто, вы могли бы поставить это в скрипт в PATH, назовем его git-delete-local-to-sync, а затем, в вашем репо, просто введите git delete-local-to-sync

Смежные вопросы