git (ls-remote) - Список "удаленных" веток, упорядоченных по дате создания
Я знаю, что с помощью приведенной ниже команды git я могу перечислить все мои "удаленные" ветки...
[someone@someone-pc somerepo]$ git ls-remote
Username for 'https://somegit.com': someone
Password for 'https://someone@somegit.com':
From https://somegit.com/somepath/somerepo.git
32b73a94a2ef1be27298a7bbf6670670c9ad4892 HEAD
99cfe797ee2f4cd3fc12ea1aef8dc4ea0f3538c7 refs/heads/a_branch
687332d5e82436d806fea2c22ac5e8772e73b33a refs/heads/b_branch
b1d82987dd87b99c505282cbcdf1d4c4d36be2d2 refs/heads/c_branch
32d4a73e686524e50a92880ddbd744d1363834bb refs/heads/d_branch
097ad2a9a69399996f7e1864436d483b2a85e3c1 refs/heads/e_branch
1e92bb0aa448a840e04928272759a3941774575b refs/heads/f_branch
32b73a94a2ef1be27298a7bbf6670670c9ad4892 refs/heads/master
ВОПРОС: Есть ли способ упорядочить эти ветки по дате создания?
Спасибо! =D
ОБНОВИТЬ:
Чтобы проиллюстрировать, я бы хотел, чтобы что-то отсортировано, например, список веток gitlab...
1 ответ
Какой git ls-remote
действительно вызывает другой Git - тот, который находится по указанному выше URL-адресу, - и спрашивает его о его ссылках: HEAD
, имена веток, имена тегов и т. д. Но единственная информация, которую он отправляет, - это эти имена и хеш-идентификаторы.
Как я отмечал в комментариях выше, каждая фиксация - представленная хеш-идентификатором, который является своего рода истинным именем фиксации - имеет две отметки времени. 1 Чтобы получить одну или обе отметки времени, вы должны иметь фиксацию. Так это значитgit ls-remote
в целом недостаточно: у вас может не быть коммитов, хэш-ID которых вы получаете из другого Git.
Сначала вам нужно запустить git fetch
, который начинается таким же образом: он вызывает какой-то другой Git и получает от него список их веток, тегов и т. д., а также хеш-идентификаторы, которые представляет каждое из этих имен. Затем для их веток ваш Git создаст или обновит ваши имена удаленного отслеживания: ихmaster
становится вашим origin/master
, например. Ихdevelop
становится вашим origin/develop
. Какие бы имена у них ни были -refs/heads/*
являясь полной формой - ваш Git создает или обновляет собственный соответствующий refs/remotes/origin/*
имя. Но прежде чем ваш Git сможет это сделать, ваш Git должен также получить сами коммиты, поэтому для любых коммитов, которые у них есть, которых нет у вас, которые нужны вашему Git, ваш Git получит их.
Вы можете добавить --prune
(git fetch -p
для краткости), чтобы ваш собственный Git удалил любое имеющееся у вас имя удаленного отслеживания, которое больше не соответствует ветке в их Git. Если вы этого не сделаете, вы навсегда сохраните устаревшие имена для удаленного отслеживания (или до тех пор, пока вы не удалите их явно). На самом деле это не столько вред, сколько беспорядок.
Теперь у вас есть все их коммиты, плюс те, которые вы еще не отправляли. У вас также есть все их имена, замененные на имена для удаленного отслеживания.
Вы можете просмотреть эти ветки с помощью git branch -r
. Порядок сортировки по умолчанию дляgit branch
находится в алфавитном порядке внутри группы. 2 Но вы можете дать--sort=key
вариант: 3
git branch -r --sort=authordate
или:
git branch -r --sort=committerdate
который будет отсортирован на основе соответствующей отметки времени, хранящейся в фиксации, на которую указывает каждое имя удаленного отслеживания.
Отсюда:
git fetch -p
git branch -r --sort=committerdate
должен дать вам то, что вы хотите (если вам не нужна дата автора; см. сноску 1).
(В сторону: мне нравится настраивать fetch.prune
к true
в моей конфигурации для каждого пользователя, так что все выборки действуют как git fetch --prune
всегда.)
1 Две отметки времени - это отметка времени автора и отметка времени коммиттера. Во многих случаях в любом случае дата и время одинаковы. Новая фиксация в целом будет одинаковой, а затем, если вы скопируете фиксацию в новую и улучшенную, черезgit commit --amend
или git rebase
или любым другим способом сделать это, новый и улучшенный коммит имеет информацию об авторе старого коммита и информацию о вас и сейчас в качестве информации о коммиттере.
2 Технически это больше ASCII-бет или UTF-8-бет, чем алфавит: цифра идет перед прописными буквами, а заглавная - перед строчными.
3 Вашgit branch
должен быть достаточно новым, чтобы иметь --sort
вариант, который был представлен git branch
в Git 2.7. Если ваш Git старше, рассмотрите возможность использованияgit for-each-ref
.