Я работаю с двух разных компьютеров (A и B) и храню обычный git remote в каталоге dropbox.
Допустим, у меня есть две ветви: master и devel. Оба отслеживают свои удаленные аналоги origin / master и origin / devel.
Теперь, находясь на компьютере A, я удаляю ветку devel, на локальном и удаленном.
git push origin :heads/devel
git branch -d devel
Запустив git branch -a
на компьютере А, я получаю следующий список веток.
- мастер
- Происхождение / HEAD
- Происхождение / мастер
Работая git fetch
на компьютере B, я могу удалить локальную ветку devel git branch -d devel
, но не могу удалить удаленную ветку devel.
git push origin :heads/devel
возвращает следующие сообщения об ошибках.
ошибка: невозможно отправить в неквалифицированное место назначения: возглавляет / proxy3d
Назначение ссылки refspec не соответствует существующему ref на удаленном сервере и не начинается с refs /, и мы не можем угадать префикс на основе исходного ref.
фатальный: удаленный конец неожиданно завис
git branch -a
все еще перечисляет origin / devel в удаленных ветках.
Как я могу очистить удаленные ветви с компьютера B?
источник
Ответы:
Во-первых, каков результат
git branch -a
на машине B?Во- вторых, вы уже удалены
heads/devel
наorigin
, так вот почему вы не можете удалить его из машины B.Пытаться
или
или
и не стесняйтесь добавлять
--dry-run
в конец своегоgit
утверждения, чтобы увидеть результат его выполнения без его фактического выполнения.Документы для
git remote prune
аgit branch
.источник
git remote prune origin
работал для меня =>* [pruned] origin/my-old-branch
git remote prune origin --dry-run
показывает, что было бы удалено без этого.git fetch origin --prune
было идеально, чтобы удалить удаленные ветвиgit branch -vv
следует,git branch -D branchname
и, наконец, чернослив является лучшим способом.git config remote.origin.prune true
Рассмотрим для запуска:
Регулярно в каждом репо удалять локальные ветви, которые отслеживали удаленную ветку, которая удалена (больше не существует в удаленном репозитории GIT).
Это может быть дополнительно упрощено
это
per-repo
настройка, которая в будущемgit fetch or git pull
автоматически обрезает любое будущее .Чтобы настроить это для своего пользователя, вы также можете отредактировать глобальный .gitconfig и добавить
Тем не менее, рекомендуется сделать это с помощью следующей команды:
или применять его в масштабе всей системы (не только для пользователя)
источник
Вот скрипт bash, который может сделать это за вас. Это модифицированная версия http://snippets.freerobby.com/post/491644841/remove-merged-branches-in-git скрипта. Моя модификация позволяет ему поддерживать различные удаленные местоположения.
источник
sed
с. Заменитьsed 's/\(.*\)\/\(.*\)/\1/g'
наsed 's/\([^/]*\)\/\(.*\)/\1/g'
Эта команда "пробный запуск" удалит все удаленные (
origin
) объединенные ветви, кромеmaster
. Вы можете изменить это или добавить дополнительные ветки после master:grep -v for-example-your-branch-here |
Если это выглядит хорошо, удалите
--dry-run
. Кроме того, вы можете сначала проверить это на развилке.источник
Если
git branch -r
показано много веток удаленного отслеживания, которые вас не интересуют, и вы хотите удалить их только из локальной сети, используйте следующую команду:Более безопасной версией было бы удалить только объединенные:
Это может быть полезно для больших проектов, где вам не нужны ветви функций других товарищей по команде, но есть много веток удаленного отслеживания, извлеченных из исходного клона.
Однако одного этого шага недостаточно, потому что эти удаленные ветви удаленного отслеживания будут возвращаться позже
git fetch
.Чтобы прекратить получать эти ветки удаленного отслеживания, вам нужно явно указать ссылки для извлечения в .git / config :
В приведенном выше примере мы только извлечь
master
,develop
и освободить ветви, не стесняйтесь , чтобы адаптироваться , как вам нужно.источник
git fetch origin branchname
или создать псевдоним, например,ft = "!f() { git fetch origin $(git rev-parse --abbrev-ref HEAD);}; f"
выбрать только текущую ветку (мой личный фаворит). Приветствия.-r
флаг? Я вижу,xargs
есть-R
аргумент, но не нашел ничего о-r
. Я имею в виду, теоретически, если я правильно помню, какxargs
работает, даже без-r
него должно работать.| xargs git branch -d
. Кроме того, удаляя-r
option (--remotes
),git branch -d
мы очищаем только локальные ветви (чего может быть достаточно, учитывая, что по умолчаниюgit branch
удаленные ветви не отображаются).xargs -r
, а именно--no-run-if-empty
, это расширение GNU означает, вот хорошее объяснение .Удаление всегда является сложной задачей и может быть опасным !!! Поэтому сначала выполните следующую команду, чтобы увидеть, что произойдет:
Сделав так, как описано выше,
git
вы получите список того, что произойдет, если будет выполнена команда ниже.Затем выполните следующую команду, чтобы удалить все ветви из удаленного репо, которых нет в вашем локальном репо:
источник
-n
(пробный запуск) к этой команде, чтобы вы могли просмотреть изменения, а затем, если все в порядке, вызвать их снова без-n
.Вот как это сделать с SourceTree (v2.3.1):
1. Нажмите «Получить»
2. Установите флажок «Удалить ветви отслеживания ...»
3. Нажмите OK
4. 😀
источник
Я должен добавить ответ здесь, потому что другие ответы либо не охватывают мой случай, либо излишне сложны. Я использую github с другими разработчиками, и я просто хочу, чтобы все локальные ветки, удаленные (возможно, объединенные и) удаленные из github PR, были удалены за один раз с моей машины. Нет, такие вещи, как
git branch -r --merged
ветки, которые не были объединены локально, или ветви, которые вообще не были объединены (заброшены) и т. Д., Поэтому необходимо другое решение.Во всяком случае, первым шагом я получил его из других ответов:
Пробный
git remote prune origin
казалось , что это будет делать то же самое в моем случае, так что я пошел с самой короткой версией , чтобы сохранить его простым.Теперь a
git branch -v
должен пометить ветви, удаленные из которых удалены[gone]
. Поэтому все, что мне нужно сделать, это:Так просто, он удаляет все, что я хочу для приведенного выше сценария.
Менее распространенный
xargs
синтаксис таков, что он также работает на Mac и BSD в дополнение к Linux. Осторожно, эта команда не является пробной, поэтому она принудительно удалит все ветви, отмеченные как[gone]
. Очевидно, что это git - ничто не уходит навсегда, если вы видите удаленные ветки, которые, как вы помните, хотели сохранить, вы всегда можете восстановить их (вышеприведенная команда перечислит их хэш при удалении, поэтому все простоgit checkout -b <branch> <hash>
.источник
Удалите те же самые ветки из локальных и удаленных ссылок (в моем примере из
origin
).источник