Как перечислить все удаленные существующие филиалы в git? - PullRequest
0 голосов
/ 28 февраля 2020

Я пытался git remote -r просмотреть все удаленные существующие ветви, но я обнаружил, что результат включает те ветви, которые удалены удаленно, есть ли способ отфильтровать эти ветви "Zomb ie"?

Ответы [ 3 ]

1 голос
/ 29 февраля 2020

Этот вопрос имеет несколько возможных основных значений, поэтому у него есть несколько возможных ответов. Ключевой вопрос здесь заключается в том, что задействованы как минимум два разных Git репозитория.

Remotes

Прежде чем мы перейдем к двум ответам, отметим, что remote - это короткое имя, подобное origin. Сам пульт содержит URL , по которому ваш Git вызывает другой Git. Вы можете иметь столько пультов, сколько захотите. Есть и другие вещи, которые вы можете сделать с пультом, помимо простого сохранения URL-адреса, но сохранение URL-адреса является своего рода главным. Команда git remote - это основная пользовательская команда для работы с пультами, но поскольку git clone создает для вас пульт с именем origin, вам практически никогда не требуется использовать git remote.

Имена удаленного отслеживания

Ваш Git на вашем компьютере сохраняет и обновляет ваш Git репозиторий. Ваш Git имеет ваши имена ветвей, имена тегов и другие имена, а также набор коммитов. коммиты - это часть, которую ваш Git делит с другими Git репозиториями, хотя также есть некоторая степень совместного использования имен.

Между тем, поскольку у вас Git есть Вызвал еще один Git и запомнил URL для , который другие Git под именем origin, ваш Git также помнит их Git имена веток. Для этого ваш Git создает в своем хранилище имен для удаленного отслеживания 1 , таких как origin/master. Эти имена просто помнят, что в прошлый раз, когда ваши Git звонили другим Git в origin, они говорили, что их master был каким-то конкретным га sh ID.

Когда вы запускаете git fetch origin (или просто git fetch, если есть только один пульт с именем origin), ваш Git вызывает другой Git в этот момент, получает любой новые коммиты, которые у них есть, которых у вас нет, и обновляет все ваши имена для удаленного отслеживания origin/*.

Запуск git branch -r выведет список ваших имен для удаленного отслеживания, поэтому git branch -r покажет вам, что ваш Git видел в их Git, последний раз, когда ваш Git обновлялся с использованием их Git. Обратите внимание, что git branch -a включает git branch -r, но добавляет слово remotes/ перед именами origin/master. 2

Однако здесь возникает одна проблема: может удалить некоторые названия филиалов. Предположим, например, что их Git вчера имели ветвь с именем feature/tall, но больше не имеют этой ветки. Ваш Git вчера вызвал их Git и создал или обновил ваш origin/feature/tall, чтобы соответствовать их feature/tall. Теперь ваши Git вызывают свои Git, и они не перечисляют feature/tall.

  • По умолчанию ваш Git ничего не делает this.

  • Однако, если вы запустите git fetch --prune, ваш Git вызовет их Git как обычно, перечислит все имена их ветвей и обнаружит, что у вас есть устаревшие origin/feature/tall, возвращаемые, когда у них было feature/tall, а удаляет это.

Итак, в общем, вы должны добавить --prune каждому git fetch, так что имена для удаленного отслеживания Git будут удалены, как только ваш Git заметит, что они устарели (но не раньше). Вы можете настроить свой Git, чтобы сделать это автоматически:

git config fetch.prune true

Вы можете настроить Git так, чтобы оно использовалось по умолчанию для всех ваших репозиториев. на вашем ноутбуке или любой другой машине, которую вы используете, с:

git config --global fetch.prune true

См. документацию git config для (очень длинного) списка всего, что git config действительно может сделать.


1 Документация Git в основном называет эти имена удаленных отслеживающих ветвей , но я думаю, что смысл в конечном итоге станет более понятным, если мы оставим слово филиал отсюда.

2 Все имена Git - имена ветвей, имена тегов, имена для удаленного отслеживания и другие подобные имена - живут в пространствах имен и иметь более длинные полностью определенные имена, чтобы сделать их явными. Например, ваша ветвь master действительно refs/heads/master; Ваш тег v1.2, если он у вас есть, действительно refs/tags/v1.2. Имена удаленного отслеживания, такие как origin/master, действительно refs/remotes/origin/master.

Git обычно удаляют часть refs/heads/ имен ветвей, часть refs/tags/ имен тегов и часть refs/remotes/ имен удаленного слежения при отображении этих сокращенных имен. По какой-то причине git branch -a удаляет только часть refs/ при отображении имен удаленного отслеживания, даже если git branch -r удаляет часть refs/remotes/. (Причина этого мне не ясна.)


Имена ветвей на пульте

Поскольку здесь задействован второй Git, вы также можете просто иметь свой Git позвоните ему прямо сейчас , сделайте так, чтобы он перечислил все свои имена ветвей, и пусть ваш Git напечатает эти имена. Команда git ls-remote делает именно это:

git ls-remote origin

вызывает Git в origin, заставляет их перечислить свои ветви и теги и другие подобные имена, а затем печатает все из них. (Он не не обновляет ни одно из ваших имен для удаленного слежения: осталось git fetch, а также git remote update.)

Команда git remote show может также вызовите другой Git и получите информацию непосредственно от него, и покажите это. Иногда это так, а иногда нет. Это задокументировано , хотя и не очень ясно; подробности см. в документации git remote .

Сводка

  • git branch -r показывает имена ваших Git для удаленного слежения. Это быстро, поскольку это полностью локально. Но это может быть устаревшим.

  • git fetch обновляет имена ваших Git для удаленного слежения; добавьте -p или --prune, чтобы очистить устаревшие, или установите fetch.prune в значение true. Это медленно, так как добавляет новые коммиты, которых у вас нет, но впоследствии ваши имена для удаленного отслеживания быстро используются.

  • git remote update в основном делает то же самое вещь как git fetch. Поскольку git fetch короче для ввода, я рекомендую вместо этого использовать git fetch.

  • git ls-remote вызывает другой Git и получает имена его ветвей. Это несколько медленно, но не так медленно, как git fetch, если есть новые коммиты, так как он не получает коммиты - только имена и соответствующие идентификаторы ha sh.

  • git remote show иногда работает локально, а иногда вызывает другой Git. Я нахожу его поведение несколько запутанным и не очень полезным, и обычно рекомендую избегать его.
1 голос
/ 29 февраля 2020

Чтобы отобразить ветки:

# -a = all branches
$ git branch -a

# -r = remote branches
$ git branch -r

Чтобы удалить ветки

git fetch

git fetch обновит ваш локальный репозиторий с содержимым из формы remote.

При добавлении --prune будет remote удаленные ветви с пульта , но не удалит их локально, если они извлечены

$ git fetch --all --prune

git remote prune

Чтобы очистить ветви удаленного отслеживания, то есть удалить ссылки на несуществующие удаленные ветви, используйте команду «git remote prune» и укажите имя удаленного компьютера.

$ git remote prune <remote name>
0 голосов
/ 29 февраля 2020

Если вы перечислите удаленные ссылки с указанным параметром --heads, вы получите ветви.

git ls-remote --heads

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...