2014-01-09 9 views
12

Людей страница git filter branch говорит:Когда вам нужно `--tag-name-filter cat` для` git filter-branch`?

use "--tag-name-filter cat" to simply update the tags. 

Позже он даже говорит:

use --tag-name-filter cat -- --all 

Однако --all должен включать --tags, поэтому все теги должны надлежащим образом получить переписаны.

Небольшой тест проверяет это:

$ git init 
$ mkdir dir 
$ touch dir/file 
$ git add . 
$ git commit -am init 
$ git ls-files 
dir/file 
$ git tag tag 
$ git for-each-ref 
3006eb0a031e40901122ac8984c85ad533982f8b commit refs/heads/master 
3006eb0a031e40901122ac8984c85ad533982f8b commit refs/tags/tag 
$ git filter-branch --subdirectory-filter dir -- --all 
Rewrite 3006eb0a031e40901122ac8984c85ad533982f8b (1/1) 
Ref 'refs/heads/master' was rewritten 
Ref 'refs/tags/tag' was rewritten 
$ git for-each-ref 
8e5f09c93a2fbdb435dbe7019abeb841cb5857b2 commit refs/heads/master 
3006eb0a031e40901122ac8984c85ad533982f8b commit refs/original/refs/heads/master 
3006eb0a031e40901122ac8984c85ad533982f8b commit refs/original/refs/tags/tag 
8e5f09c93a2fbdb435dbe7019abeb841cb5857b2 commit refs/tags/tag 

Поэтому вопрос:

В какой ситуации мне нужен --tag-name-filter cat?

Существует также Why has git-filter-branch not rewritten tags?, но я не вижу, как попасть в такую ​​ситуацию.

ответ

17

Вы должны «--tag-name-filter» для git filter-branch в любое время вы хотите, чтобы он на самом деле обновить/создать свой теги - а не просто создать переписан совершает те теги указывают. Команда, которую вы предоставляете коммутатору, представляет собой скрипт оболочки, который получает имя тега old, а git-filter-branch uses the command передано '--tag-name-filter', чтобы определить, каким вы хотите новое имя тега.

Например, если у вас есть тег под названием «работа за солнцем» и используется «--tag-name-filter sed s/sun/oracle/», вместо этого вместо нового тега будет создан новый тег «work-by-oracle».

Более нормально, если вы используете «--tag-name-filter cat», команда просто cat, и имя тега используется одно и то же, как оригинальный тег - так тег перезаписывается, чтобы указать на нового коммит.

«--all» часть аргументов командной строки указывает, что рефов должны получить переписано, но теги не будет обновляться, если не использовать параметр --tag-name-filter.

Если все это кажется немного затруднительным, вы можете подумать, можете ли вы достичь того, что хотите, используя BFG Repo-Cleaner.

Полное раскрытие информации: Я являюсь автором BFG Repo-Cleaner.

+1

В приведенном выше примере тег 'tag' не совпадает с тегом ref' refs/original/refs/tags/tag'? Даже без '--tag-name-filter' тег' tag' указывает на новый коммит после ветки фильтра. – michas