Видаліть старі віддалені гілки з Git


80

Коли я використовую автозаповнення bash у Git, він постійно показує мені гілки старих пультів дистанційного керування, яких у мене вже немає. Коли я роблю a, git branch -laвін показує ті старі пульти та гілки, тоді як git branch -lні. A ls .git/refs/remotes/також їх показує. Однак вони відсутні в моєму .git / config, а також не відображаються під час запуску git remote show.

Тож як я можу від них позбутися, бо зараз мій список автозаповнення занадто довгий.

Я вже пробував:

git reflog expire --expire=now --all
git gc --prune=now
rm .git/refs/remotes/theoldremote
git remote prune theoldremote

Я також усвідомлюю той факт, що я можу просто повторно клонувати репо, але це просто обман ;-)


Примітка: a git remote rmзараз (git 2.0.1, червень 2014) видаляє спочатку віддалені гілки відстеження. Це має допомогти уникнути очищення старих гілок. Дивіться мою відповідь нижче
VonC


Ось моя інша відповідь: stackoverflow.com/a/44129766/3835843
Аріф

Відповіді:


142

Git не видаляє (локальні) гілки віддаленого відстеження автоматично, якщо гілка була видалена у віддаленому сховищі. Крім того, до V2.0.1 гілки дистанційного відстеження в деяких випадках не видалялися, коли ви видаляли пульт з конфігурації git (див. Відповідь VonC).

Щоб видалити застарілі гілки віддаленого відстеження (гілки, видалені у віддаленому сховищі) для одного із віддалених сховищ, запустіть

git remote prune <remote>

Щоб процитувати сторінку керівництва або git remote:

чорнослив

Видаляє всі застарілі гілки відстеження під <ім'я>. Ці застарілі гілки вже були видалені з віддаленого сховища, на яке посилається <name>, але все ще доступні локально в "віддалених / <name>".

За допомогою параметра --dry-run повідомте, які гілки будуть обрізані, але насправді не обрізайте їх.

Однак із вашого запитання, здається, ви вручну видалили .git/refs/remotes/theoldremote , тож Git більше не знає про віддалене сховище, до якого належали гілки віддаленого відстеження. Це не так, як ти повинен це робити.

Звичайний спосіб видалення віддаленого сховища - це запуск

git remote rm <remote>

Це видалить пульт з вашого .git/config , а також видалить гілки дистанційного відстеження.

Якщо ви просто видалите каталог під .git/refs/remotes/, гілки залишаться позаду. Потім їх потрібно буде видалити вручну:

git branch -rd <remote>/<branchname>

Вам потрібна можливість -rвидалити віддалену гілку.


2
Ні, це не все. Це говорить fatal: 'kolichikov' does not appear to be a git repository.
Алекс

2
Для автоматичної обрізки гілок віддалених на вибірки / тягнути, дивіться також: stackoverflow.com/a/18718936/968201
Патрік Джеймс McDougle

Якщо ви вважаєте, що це повільно, перейдіть на новіший Git (2.0.1+ IIRC), де це виправлено (швидше в 100 разів).
odinho - Velmont

Примітка для користувачів prune: Документація Git говорить: " У більшості випадків користувачі повинні запускати git gc, що викликає git prune. ". Однак зверніть увагу, що git gcце не сумісно з --dry-run.
JYL

git branch -rd <remote>/<branchname>було те, що я шукав. Дякую!
Антуан Колсон,

16

я використовую

git push origin :remote_branch

видалити гілку з сервера.

git remote prune origin

видалити віддалені посилання, яких більше немає на сервері


Ні, це не все. Там написаноfatal: 'kolichikov' does not appear to be a git repository
Алекс

1
Алекс, ти повинен запустити команду всередині папки сховища, а не в домашній папці ...
SparK

6

Примітка. Хоча git remote prune - це відповідь, знайте, що, починаючи з git 2.0.1 (25 червня 2014 р.), A git remote rm починається з видалення віддалених гілок відстеження .
Тож сподіваємось, не слід очищати старі гілки після git remote rm.

Див. Коміт b07bdd3 від Єнса Ліндстрема ( jensl)

remote rm: видалити віддалену конфігурацію як останню

Видаляючи віддалений, видаліть гілки віддаленого відстеження перед видаленням віддаленої конфігурації.
Таким чином, якщо операція не вдається або перервана під час видалення гілок віддаленого відстеження, команду можна повторити для завершення операції .


Але якщо вам потрібно, простого git fetchможе бути достатньо, за умови, що ви встановили першим:

git config --global fetch.prune true
cd /path/to/repo
git config remote.origin.prune true

Див. Також github.com/git/git/commit/…
VonC

4

Нічого не натисніть на гілку, щоб видалити її:

git push remote :remote_branch

Це десь у документах, але насправді це не очевидно.

Або я неправильно зрозумів ваше запитання?


2
"Це десь у документах, але насправді це не очевидно". такий єgit
mnagel

Під "віддаленим" я мав на увазі ваше ім'я віддаленого сховища. Такі як "походження" чи що інше. Але я починаю думати, що ви мали на увазі щось інше, аніж просто видалення віддаленої гілки.
aragaer

Що - то ще , наприклад , як це: stackoverflow.com/questions/1072171 / ...
aragaer

4

Гаразд Проблема полягала в тому, що пульти дистанційного керування вже не існують, але вони існують десь у базі даних git. Я знову додав пульти, а потім зробив

git remote prune theremote
git remote rm theremote
git gc --prune=now

Після цього вони зникають зі списку. Якось я їх не видалив правильно, перш ніж здогадатися.


Я спробував все з безлічі джерел, і єдине, що спрацювало, було повторно додати проблему дистанційного керування, а потім видалити її. Дякую!
jc00ke

0

Я заплутався, коли віддалені гілки, видалені на стороні сервера, все ще з'являлися під час запуску:

$ git branch --all

Наступна команда виправила це для мене (у git версії 2.25.0):

$ git remote update --prune
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.