Як видалити недійсну посилання віддаленої гілки з Git?


731

У моєму поточному репо маєте такий вихід:

$ git branch -a
* master
  remotes/origin/master
  remotes/public/master

Я хочу видалити remotes/public/masterзі списку філій:

$ git branch -d remotes/public/master
error: branch 'remotes/public/master' not found.

Також вихід git remoteдивного вигляду, оскільки він не перераховує public:

$ git remote show 
origin

Як я можу видалити "remote / public / master" зі списку філій?

Оновіть, спробувала git pushкоманду:

$ git push public :master
fatal: 'public' does not appear to be a git repository
fatal: The remote end hung up unexpectedly

31
Чи працювали у вашому сценарії git remote prune [remote-name]чи git fetch -p [remote-name]ні? Робити це git gcнабагато сильніше, ніж зазвичай.
rjmunro

6
git remote prune [remote-name]не працюватиме з мерзотником СВН, хоча ні один не чинить git gc... git branch -rd origin/nameробить роботу , хоча. @Casey, ймовірно, слід вибрати другу відповідь - це трохи менш небезпечно.
naught101

4
Я люблю це питання. Повертаємось майже щомісяця
олукіман

Пов’язана, якщо не цільова ціль: Видалення гілки Git як локально, так і віддалено .

2
Щоб уникнути помилок g00 nitterb в майбутньому, рекомендую використовувати інший приклад гілки, ніж master... особливо при видаленні на пульті.
абсинс

Відповіді:


743

Можливо, вам знадобиться очищення:

git gc --prune=now

або вам може знадобитися чорнослив:

git remote prune public

чорнослив

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

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

Однак, здається, їх слід було очистити раніше

git remote rm public 

рм

Видаліть пульт з ім'ям <ім'я>. Всі гілки відстеження та налаштування конфігурації для віддаленого видаляються.

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

Можливо, запустіть це ще раз і подивіться, що станеться.


Контекст поради

Якщо ви заглянете в журнали редагування , ви зауважте, що я запропонував більш "правильні" методи, які з будь-якої причини не хотіли працювати у своєму сховищі.

Я підозрював, що ОП зробила щось, що залишило їхнє дерево в непослідовному стані, що призвело до того, що воно поводилося трохи дивно, і git gcвимагалося, щоб виправити ліву частину ззаду.

Зазвичай git branch -rd origin/badbranch достатньо для видалення локальної гілки відстеження або git push origin :badbranchдля видалення віддаленої гілки, і зазвичай вам ніколи не потрібно буде дзвонитиgit gc


4
Я не хочу видаляти гілку на віддаленій стороні. Я думаю, що є тонка різниця.
cmcginty

2
Е, питання фактично задає "як видалити віддалену гілку". Ось які ці шляхи.
Кент Фредрік

1
Я перефразую тему, якщо це стане більш зрозумілим, про що я запитую, але команда показує, в чому саме моя проблема.
cmcginty

40
git gcТут не потрібно, але git remote pruneя відчуваю себе більш безпечним, ніж видаляти речі вручну git branch -rd, оскільки git перевіряє, які віддалені гілки виконуються.
Майк Сепловіц

3
це не спрацювало для мене - однак, "git branch -rd" працював чудово.
dsummersl

683

Все, що вам потрібно зробити - це

git fetch -p

Це видалить усі ваші локальні гілки, які віддалено видаляються.

Якщо ви перебуваєте на git 1.8.5+, ви можете встановити це автоматично

git config fetch.prune true

або

git config --global fetch.prune true

7
Це я і шукав - питання описує сценарій складніший за звичайний.
rjmunro

22
Я шукаю спосіб видалення локальних гілок, де видалено відповідний пульт, але це не працює для мене. Будь-яка ідея чому?
jackocnr

11
Це видаляє гілки, перелічені у віддаленому / вихідному, але не видаляє локальні гілки відстеження, що так само важливо.
BlueRaja - Danny Pflughoeft

@Cupcake Оскільки ви не відмовили мою першу редакцію (яка виправляла невірну інформацію про Git 1.8.5+), ви зробили це неправильно. Друга моя редакція виправляла те, що я вказав, що було невірно, що зараз знову (з вашим відказом). Будь ласка, продовжте і поверніть ще одну редакцію, щоб мати оригінал. Дякую.
ferventcoder

@ferventcoder Я двічі перевірив останню редакцію та повернувся до неї. ОП може відкатати знову, якщо йому це не подобається. Дякую.

319
git push public :master

Це видалить віддалену гілку, яку назвав masterКент Фредрік.

Щоб перелічити гілки віддаленого відстеження:

git branch -r

Щоб видалити гілку віддаленого відстеження:

git branch -rd public/master

6
Це допомогло мені видалити віддалену гілку ghost.
Нік

9
git branch -rd removed_remote/branchпрацював на мене, тоді як той git gc --prune=nowбув нікчемним.
rchampourlier

2
Мені вдалося користуватися git pruneбез будь-яких проблем, але мій колега, який відправив нашу головну репо **, МОЖЕ ТОЛЬКО ** використовувати git branch -rd public/masterрішення -style, щоб очистити своє оточення.
Абель

3
git branch -rd public/masterбуло те, чого я бракував. У мене був heroku/masterі herkou/master... lol wops
Аарон

@rchampourlier Не на 100% марний - якщо ваш git repo великий, видалення невикористаних гілок може звільнити багато дискового простору в деяких ситуаціях.
петерх

159

Все, що вам потрібно зробити - це

$ git branch -rd origin/whatever 

Це так просто. Тут немає причин дзвонити на gc.


1
як ви "підштовхуєте" це видалення до github?
Туфір

14
@Thufir Це не про це питання. Це питання було спеціально для ситуацій, коли у вас є недійсна віддалена посилання в локальному репо, але ця гілка більше не існує на віддаленому сервері. Відповідь на ваше запитання - $ git push origin: що завгодно
jpswain

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

6
Якщо у вас є велика робота з очищення (багато вивішених віддалених пристроїв), ви можете просто видалити всі віддалені гілки з чимось на зразок, git branch -rd $(git branch -r)а потім відновити дійсні, зробивши їх.
nobar

Моя ситуація полягала в тому, що я git config -eперейменував свій пульт. Я перейменував пульт mineв origin. Тоді це рішення, яке найкраще працювало для мене:git branch -rd $(git branch -r | grep 'mine/')
Стівен Лу

70

git gc --prune=now це не те, що ти хочеш.

git remote prune public

або git remote prune origin#, якщо це віддалене джерело

це те, що ти хочеш


6
@Casey $ git gc # схоже на дефрагментацію файлів git для прискорення сховища $ git віддаленого походження чорносливу # очистить видалення застарілих віддалених гілок, які відображаються з "git гілками -r | grep походження". Це те, що питання задає, я вірю. Отже, команди абсолютно різні.
Язик

29

Прийнята відповідь не спрацювала для мене, коли реферат був запакований. Однак це:

$ git remote add public http://anything.com/bogus.git
$ git remote rm public

Працювали для мене. Регулярна гілка-git -d не працювала, повернулася помилка, що гілка не існує, тому що я видалив походження, зване "оригінал", створене помилково, безпосередньо у .git / config файл.
micrub

Це метод, який мені довелося використовувати для видалення гілок, які були ненавмисно опущені з мого .git / config (які довелося перебудувати через непов'язану корупцію). Дуже погано, що ця відповідь була настільки вниз по ланцюгу, що я її не помітив, поки нарешті знайшов рішення і пішов додати його до прийнятої відповіді!
таранакі

Це те, що мені було потрібно після використання svn2git. Було багато віддалених / svn / * гілок. Довелося створити спочатку хибний пульт 'svn'.
Сем

7

У моєму випадку я намагався видалити записи, збережені в .git/packed-refs. Ви можете відредагувати цей звичайний текстовий файл та видалити з нього записи, які git br -Dне знають, як торкнутися (принаймні, у версії 1.7.9.5).

Я знайшов це рішення тут: https://stackoverflow.com/a/11050880/1695680


вау, це мені допомогло. Мій колега спробував, перезапустіть VS, перезавантажте комп'ютер, нічого не працювало, він видалив місцеве репо і витягніть все, щоб позбутися цього :)
Esen

1
Сьогодні я схилявся до того, що цей файл із упакованим реф-файлом створюється як частина git gc, коли він запаковує ваші комісії у високо стислий архів, він також переміщує посилання в єдиний звичайний текстовий файл, можливо, для оптимізації; Я сподіваюсь, що майбутні версії git можуть git br -D ...запакувати посилання.
ThorSummoner


3

Я про це не знав git branch -rd, тому спосіб вирішення таких питань для себе - це ставитися до мого репо як віддаленого репо і робити віддалене видалення. git push . :refs/remotes/public/master. Якщо інші способи не спрацьовують і у вас є якась дивна посилання, яку ви хочете позбутися, цей сирий спосіб є надійним. Це дає точну точність видалити (або створити!) Будь-які посилання.


2

Лише трохи пов'язані, але все ж можуть бути корисними в тій же ситуації, що і у нас - ми використовуємо мережевий спільний файл для нашого віддаленого сховища. Минулого тижня все працювало, на цьому тижні ми отримували помилку "Віддалене походження не рекламувало Ref для відгалужень / голів / master. Цей Ref може не існувати у віддаленому режимі або може бути прихований налаштуваннями дозволу"

Але ми вірили, що нічого не було зроблено для розбещення речей. NFS робить знімки, тому я переглянув кожну "попередню версію" і побачив, що три дні тому розмір у МБ сховища перейшов від 282 Мб до 33 МБ, і зараз існувало близько 1403 нових файлів і 300 папок. Я запитав своїх колег, і той спробував здійснити натиск у той день - потім скасував це.

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

Сподіваюся, що це може допомогти комусь іншому одного дня!

Джей


2

У мене була схожа проблема. Жодна з відповідей не допомогла. У моєму випадку у мене було два видалені віддалені сховища, які відображаються назавжди.

Моя остання ідея полягала в тому, щоб видалити всі посилання на нього вручну.

Скажімо, сховище називається “Repo”. Я зробив:

find .git -name Repo 

Отже, я видалив відповідні файли та каталоги із папки .git ( цю папку можна знайти у вашому додатку Rails або на вашому комп’ютері https://stackoverflow.com/a/19538763/6638513 ).

Тоді я зробив:

grep Repo -r .git

Тут було знайдено кілька текстових файлів, з яких я видалив відповідні рядки. Тепер все, здається, добре.

Зазвичай, ви повинні залишити цю роботу, щоб git.

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