Вы можете получить некоторую нужной информации с помощью git ls-remote
. При этом ваш Git вызовет другой Git и попросит другого Git перечислить его имена веток и тегов, а также соответствующие идентификаторы ha sh.
Ваш в строке темы запрашивается:
git коммит и информация о тегах на ветке
, но эта фраза неверна. В частности, «информация тега» - что бы вы ни подразумевали под этой фразой - это никогда «на ветке»; самое большее, имя тега совпадает с именем ветви, или тегированный объект доступен из одного или нескольких имен ветви. Так как один коммит может быть в десятках ветвей, для имени тега нет ничего необычного в том, чтобы идентифицировать коммит в 1 нескольких ветвях.
A имя ветки is имя, чья полностью прописанная форма начинается с refs/heads/
: например, ветвь master
действительно refs/heads/master
. имя тега - это имя, чья полностью прописанная форма начинается с refs/tags/
: например, тег v2.1
действительно refs/tags/v2.1
. Команда git ls-remote
имеет свои Git, сообщающие Git свои полные имена, например, те, у которых refs/heads/
являются именами их ветвей, и соответствующие им идентификаторы ha sh.
Каждый имя просто содержит один га sh ID. Два разных имени могут содержать два разных идентификатора ha sh или один и тот же ha sh ID.
Имена ветвей ограничены: они всегда содержат идентификатор ha sh некоторого существующего действующего коммита. Имена тегов часто содержат идентификатор ha sh аннотированного объекта тега , а не фиксации. Если имя тега содержит идентификатор ha sh объекта тега, вы получите две строки вывода. Вот фрагмент вывода из git ls-remote
:
274b9cc25322d9ee79aa8e6d4e86f0ffe5ced925 refs/heads/master
...
74d2a8cf12bf102a8cedaf66736503bb3fe88dfb refs/tags/v2.2.0
b260d265e189728b26e50506ac6ffab6a7d588da refs/tags/v2.2.0^{}
3fabc04268de1cec1628265810769e33dae44cd8 refs/tags/v2.2.0-rc0
4ace7ff4557350b7e0b57d024a2ea311b332e01d refs/tags/v2.2.0-rc0^{}
Это говорит нам, что их Git master
идентифицирует commit 274b9cc25322d9ee79aa8e6d4e86f0ffe5ced925
. Их Git v2.2.0
идентифицирует теговый объект 74d2a8cf12bf102a8cedaf66736503bb3fe88dfb
, который, в свою очередь, идентифицирует другой объект, в данном случае b260d265e189728b26e50506ac6ffab6a7d588da
.
Невозможно определить, какой тип объекта b260d265e189728b26e50506ac6ffab6a7d588da
есть, но на самом деле это коммит. (Чтобы выяснить это, у нас есть Git, чтобы передать объекты нашему Git и затем использовать git cat-file -t
.)
Я хочу определить, произошло ли n коммитов с репо ...
Если n здесь означает число , вы не можете этого сделать: для подсчета коммитов необходимо, чтобы у вас было коммиты.
Если n здесь означает new , вы не можете совсем сделать это. Предположим, вы обнаружили, что у них есть имя ветви B , которое идентифицирует коммит C1 прямо сейчас. Завтра вы запрашиваете их хранилище и обнаруживаете, что у них есть имя ветки B , но оно идентифицирует commit C2 прямо сейчас. Вы можете сказать, что имя ветви переместилось, но вы точно не знаете, что оно переместилось «вперед», чтобы совершить new коммитов. Возможно, он переместился «назад», чтобы отказаться от коммитов, или «в сторону», чтобы некоторые старые коммиты исчезли, а некоторые новые коммиты стали доступны.
, клонирование каждого репо или поддержание одного из них потребует много времени. ..
Клонирование репозитория может занять некоторое время, в зависимости от скорости вашей сети. В большинстве случаев, однако, обновление клона происходит довольно быстро, особенно если клон сделан с использованием --bare
или --mirror
, так что нет рабочего дерева для обновления. Следовательно, обычно это путь к go.
Некоторые системы сборки делают клон fre sh каждый раз, но используют клоны shallow , чтобы избежать переноса большинства объектов. Это может быть успешным методом работы с другими большими хранилищами.
1 Я использую здесь фразу на ветке в том смысле, что коммит достижимы из кончика ветви, как определено этим именем ветви. Другой способ описать это состоит в том, что коммит содержится в ветви. Подробнее об этом см. Думай как (а) Git.