git: Есть ли что-то вроде тегов для каждой ветви? - PullRequest
8 голосов
/ 18 апреля 2011

Мне нужно переписать историю, для которой я бы хотел пока сохранить исходное дерево.Однако переписанное дерево должно также копировать ранее использованные теги.Есть ли какая-либо ручная опция, чем, например, добавление имен тегов с именем ветви?

Ответы [ 2 ]

16 голосов
/ 18 апреля 2011

Нет, в git нет ничего похожего на тег для каждой ветви.Все ветки и теги - это просто ссылки в Git;ссылка - это просто имя, которое указывает на конкретную ревизию в истории ревизий.Например, если у вас есть ветви devel и master, а также теги v1.0 и v2.0, ссылки будут выглядеть примерно так:

refs/heads/devel ->  *
                    / \
                   *   * <- refs/heads/master
                   |   |
                   *   *
                    \ /
                     * <- refs/tags/v2.0
                     |
                     *
                     |
                     * <- refs/tags/v1.0
                     |
                     *

Как видите, ничто не связываетэти теги для любых веток;на самом деле все эти теги содержатся в ветвях master и devel.Заглянув в репозиторий .git, вы увидите, что на самом деле у тега больше нет структуры;это просто файл, содержащий SHA-1, ссылающийся на коммит в .git/refs, или строку в .git/packed-refs (теги часто будут в packed-refs, потому что они не меняются часто, тогда как ветви обычно будут отдельными файлами внутриgit/refs).

Поэтому, если вы хотите переписать историю и сохранить старые теги, вам придется переписать имена своих тегов.Как указывает sehe, это делается с помощью git filter-branch --tag-name-filter.

2 голосов
/ 08 ноября 2015

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

git-thisBranch() { git symbolic-ref --short HEAD; } 
git-localTag() { 
   local name="$1"; shift;
   git tag $(git-thisBranch)/"$name" "$@";
}
...