Почему Git хранит только ветки под refs/remotes/origin?
Посмотрев на теги Git и увидев, как они распространяются и сколько существует способов их обрезки, я пришел к выводу, что лучшим решением будет изменение структуры refs/remotes/origin/
, Итак, почему ссылки под refs/remotes/origin/
предполагается ветвями? Было бы легко скопировать структуру верхнего уровня и под удаленной ссылкой:
refs/remotes/origin/heads/ <-- remote tracking branches
refs/remotes/origin/tags/ <-- remote tracking tags
refs/remotes/origin/notes/ <-- remote tracking notes
Но все инструменты, которые работают с Git, предполагают, что ссылки под refs/remotes/origin/
являются филиалами.
Есть ли реальная причина, по которой все обстоит именно так, или это просто случайность?
Изменить 1:
Посмотрев на это немного больше, я обнаружил, что git log --decorate
будет правильно показывать аннотированные теги под refs/remotes/origin/tags/*
но легкие теги отображаются как ветви.
Конфиг файл:
[remote "origin"]
url = ssh://git@github.com/test/example.git
fetch = +refs/heads/*:refs/remotes/origin/heads/*
fetch = +refs/tags/*:refs/remotes/origin/tags/*
Легкая бирка:
commit e447ca1e2f3c765072c6bd783981619da3d6a090 (tag: v0.2, origin/tags/v0.2)
Author: Joanna Blogs <joanna@blogs.com>
Date: Thu Aug 18 14:38:48 2016 -0500
Testing out a light weight tag
Аннотированный тег:
commit 334d587e8f9bad1756665384056760c0cb798f32 (tag: v0.1, tag: origin/tags/v0.1)
Author: Joe Blogs <joe@blogs.com>
Date: Fri Jul 1 09:24:25 2016 -0500
Testing an annotated tag
Однако, как и ожидалось, git tag -l
Команда не показывает их вообще.
1 ответ
[Отредактировано значительно менее чем через день после получения ответа: предыдущий ответ основывался на другой, неправильно запомненной проблеме.]
Теги должны быть глобальными / универсальными. То есть, в Git нет такой вещи, как "удаленный тег".
Нет технической причины, по которой у Git не может быть удаленных тегов. Фактически, он может иметь как теги удаленного отслеживания (всегда принудительно обновляемые), так и глобальные теги (не обновляемые принудительно). Вот один из способов реализовать их вручную:
[remote "R"]
url = ...
fetch = +refs/heads/*:refs/remotes/R/*
fetch = +refs/tags/*:refs/rtags/R/*
fetch = refs/tags/*:refs/tags/*
Теперь, когда ты git fetch R
, если у вас уже есть тег blue
и у них есть не связанные blue
, вы получите refs/rtags/R/blue
но не будет обновлять свой собственный refs/tags/blue
,
(Это не все так удобно, так как вы должны разобрать rtags/R/blue
, но в случае столкновения вам все равно придется разобрать его, чтобы избежать двусмысленности.)
Если вы спрашиваете: "удаленные теги вместо глобальных тегов кажутся хорошей идеей, почему Git их не делает?", Мой ответ будет "история, инерция, упрямство и т. Д.", Но, конечно, вы действительно Я должен спросить у сопровождающих Git напрямую. (Это кажется невежливым, чтобы удалить глобальные теги.:-))
Если вы спрашиваете "удаленные теги в дополнение к глобальным тегам - это хорошая идея, почему Git их не делает?" мой ответ будет "я не знаю". Это правда, что я должен был поставить это под refs/rtags/R
скорее, чем refs/remotes/R/tags/
так как нет места в refs/remotes/R
для чего-либо, кроме филиалов. Если бы ребята из Git приняли это в полной общности, возможно, ваше собственное подразумеваемое предложение о простом копировании refs/*
в refs/remotes-new/*
тогда лучше всего обрабатывать их как теги, заметки и т. д. автоматически.