Почему 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/*тогда лучше всего обрабатывать их как теги, заметки и т. д. автоматически.

Другие вопросы по тегам