git віддалений чорнослив - не показав стільки обрізаних гілок, як я очікував


113

Із чоловічої сторінки:

Deletes all stale tracking branches under <name>.
These stale branches have already been removed from the remote repository
referenced by <name>, but are still locally available in "remotes/<name>".

Тому я видалив купу гілок за допомогою

git push origin :staleStuff

а потім побіг

git remote prune origin

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


7
щоб дізнатись, які гілки буде видалено, ви можете зробити git remote show originі шукати будь-які гілки з позначкоюstale
Хтось десь

Відповіді:


189

Коли ви користуєтесь git push origin :staleStuff, він автоматично видаляється origin/staleStuff, тож коли ви бігли git remote prune origin, ви обрізали якусь гілку, яку видалив хтось інший. Більш ймовірно, що вашим колегам зараз потрібно бігти, git pruneщоб позбутися від вилучених гілок.


То що саме git remote pruneробить? Основна ідея: локальні гілки (не відстежуючі гілки) не торкаються git remote pruneкомандою, і їх слід видалити вручну.

Тепер приклад у реальному світі для кращого розуміння:

У вас є віддалене сховище з 2 гілками: masterі feature. Припустимо, що ви працюєте в обох гілках, тому в результаті ви маєте ці посилання у вашому локальному сховищі (дані повні довідкові імена, щоб уникнути плутанини):

  • refs/heads/master(коротка назва master)
  • refs/heads/feature(коротка назва feature)
  • refs/remotes/origin/master(коротка назва origin/master)
  • refs/remotes/origin/feature(коротка назва origin/feature)

Зараз типовий сценарій:

  1. Деякий інший розробник закінчує всю роботу над feature, об'єднує його masterі видаляє featureгілку з віддаленого сховища.
  2. За замовчуванням, коли ви робите git fetch(або git pull), жодне посилання не видаляється з вашого локального сховища, тому у вас ще є всі ці 4 посилання.
  3. Ви вирішили їх почистити і запустити git remote prune origin.
  4. git виявляє, що featureгілки більше не існує, тому refs/remotes/origin/featureце несвіжа гілка, яку слід видалити.
  5. Тепер у вас є 3 посилання, в тому числі refs/heads/feature, оскільки git remote pruneне видаляє жодних refs/heads/*посилань.

Можна встановити локальні гілки, пов'язані з гілками віддаленого відстеження, за branch.<branch_name>.mergeпараметром конфігурації. Цей параметр насправді не потрібен, щоб нічого не працювало (можливо, крім git pull), тому він може бути відсутнім.

(оновлено прикладом та корисною інформацією з коментарів)


Я зрозумів, що ситуація така: гілки все ще присутні локально, але видалені з віддаленого репо. Тепер я хочу видалити всі локальні гілки, які не існують на пульті, тому я запускаю git prune. Ось що мені каже "Ці застарілі гілки з віддаленого сховища". Я помиляюся?
Феліксиз

3
Ви праві, але, можливо, ви неправильно зрозуміли значення "місцевих гілок" у випадку git prune. Обрізку /refs/remotes/<remote_name>/підлягають лише гілки в ; будь-які гілки в /refs/heads/не торкаються - вам потрібно вручну керувати ними.
макс

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

2
Для цього немає вбудованої команди, але ви можете написати такий сценарій самостійно. Гілки відстеження можна ідентифікувати за наявністю branch.<branch_name>.mergeпараметра config.
макс

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