2016-09-23 6 views
3

私はgit log --source --tag=<pattern>を使用して、出力を特定のタグに限定し、それらのタグを表示しています。表示されたタグはrefs/tags/で修飾されますが、パターンなしで--tagの場合はこれを行いません(または--tagを指定しない場合)。なぜ "git log --tags = <pattern>"は "refs/tags"を出力に追加しますか?

なぜこの機能を無効にできますか?

$ git init 
Initialised empty Git repository in /tmp/repo/.git/ 
$ touch new-file 
$ git add new-file 
$ git commit -m "Added new file new-file" 
[master (root-commit) c151765] Added new file new-file 
1 file changed, 0 insertions(+), 0 deletions(-) 
create mode 100644 new-file 
$ git tag TEST-TAG 
$ git log --oneline --source --tags 
c151765 TEST-TAG Added new file new-file 
$ git log --oneline --source --tags=* 
c151765 refs/tags/TEST-TAG Added new file new-file 

は(私はgitの1.9.1と2.1.0でこれを観察している。)

+0

'| sed '= \ trefs/tags/= \ t =' ' – choroba

+0

ありがとうございます@チョロバ:)私はすでに対処するために私のプログラムを修正しましたが、これは奇妙なようです! –

答えて

3

(サイドノート:--sourceは、いくつかは、最初に到達したコミットが、そこから「ソース」の参照を追加し、git log出力に)

[時々、タグは完全修飾されています。]なぜこれがオフにできますか?

すべてのGitのリファレンスは、1つの大きなネームスペースを共有しています。特殊ケース(HEADMERGE_HEADORIG_HEAD、など)を除いて、すべてが最上位ディレクトリ refs/の下に存在します。次のレベルでは、参照のタイプが決まります。refs/heads/にはブランチ名、refs/remotes/にはリモート追跡ブランチ、refs/tags/にはタグが含まれています。 (git stashのために、単にファイルではなくディレクトリである、そこノートrefs/notes/もあり、refs/stash。)

--branches=<pattern>--glob=<pattern>--remotes=<pattern>、または--tags=<pattern>を使用している場合、あなたは完全な名前を見羽目になる。ある意味では、--tags(または--branchesまたは--remotes; --globの同等物はありません)を使用するとが発生しないことが分かります。その理由は、it's an implementation quirkです。リンクされたコードを調べると、(ハイライトされたセクションの下部にある)バリアントがrefs/tags/からfor_each_glob_ref_inに明示的に渡され、--tags(上端)のバリアントは明示的に渡されません。

実際には、同じコードパターンを持つ2つのソースファイルがあります。奇妙なのは、実際にはbuiltin/rev-parse.cの方がはっきりとはっきりしていますが、git logの注釈はrevision.cのコードによるものです。

ソースでハードコードされているため、答えはいいえ、無効にすることはできません。事実の後でしか変更できません。

あなたが--source --branches --tagsを使用して、あなたがrefs/heads/blerghrefs/tags/blerghとして -suchに一致するブランチとタグの名前を持っている - そしてあなたが見る場合ことに注意してください:

f0b2db2 blergh do something or other 

blerghはブランチ名であれば、あなたが言うことができません、またはタグ名。参考文献、すなわち、をパックさ


に格納されていますが、この "ディレクトリ"の概念は概念的なものですが、もともとはまだ参照が解凍されている現在でもディレクトリです。.gitディレクトリを見ると、refs/heads/などが含まれていますrefs/

これは一般的には悪い考えです。それはすべてルールに従って動作しますが、ルールは混乱する可能性があります。特に、gitrevisionsは、タグが最初に来て、ほとんどのGitコマンド(git showなど)と同じですが、git checkoutは一致せず、タグではなくブランチをチェックアウトします(タグをチェックアウトするには、 refs/tags/blerghを書きますが、git checkout refs/heads/blerghを実行すると、分離したHEADが得られます)。同じ名前のブランチとタグを作ってしまったのを見つけたら、それをやり直してください。 :-)

関連する問題