11

(python) スクリプトで特定の git SHA をチェックアウトするときに不必要に切り離された HEAD を避けるために、その SHA がたまたまブランチの現在の HEAD である場合は、代わりにブランチをチェックアウトしたいと思います。

理想的には、git に SHA をフィードしたいのですが、SHA がブランチの現在のヒントにある場合はブランチ名を返し、そうでない場合はエラーを返します。

git describe --all --exact-match <SHA> 私が必要としているのはほとんどのものですが、それは主にタグを対象としているため、ブランチタグが私の SHA を指している場合 (たとえば、リリース ブランチでよく発生します)、タグのみが与えられます。タグをチェックアウトすると HEAD が分離されるため (ブランチが同じ SHA を指していても)、これは役に立ちません。

私はやりたくないことに注意してくださいgit branch --contains-どのブランチにコミットが含まれているかを知る必要はありません。

のようなコマンドがない場合はgit describe、ブランチについてのみ、 を介してブランチ SHA に対して SHA をクロスチェックできることがわかっていgit show-refます。ただし、これは最もエレガントなソリューションではありません。

を行うこともできますがgit name-rev --name-only <hash>、文字の出力を手動で確認する必要~があり、同じことを行う git コマンドがどこかにあるとエレガントではないと感じます。

4

8 に答える 8

2

Python を使用する場合は、次のようにします。

import subprocess

def get_name(target):
    p = subprocess.Popen(['git', 'for-each-ref', 'refs/heads/'], stdout=subprocess.PIPE)
    for line in p.stdout:
        sha1, kind, name = line.split()
        if sha1 != target:
            continue
        return name
    return None

別のオプションは、 eval の力を使用して辞書を作成することです。

d = '{' + subprocess.check_output(['git', 'for-each-ref', '--python', '--format=%(objectname): %(refname),', 'refs/heads/']) + '}'
name = eval(d)[sha1]
于 2013-09-30T23:19:49.670 に答える
2

次期 git 2.7 (2015 年第 4 四半期) では、より完全なバージョンの を入手できますgit for-each-ref--points-at

git for-each-ref --points-at <branch_name>

ドキュメントで:

--points-at <object>:

指定されたオブジェクトを指す参照のみをリストします。

これにより、コミットがそのリストに含まれているかどうかを確認できます。


commit 4a71109、commit ee2bd06commit f266c91commit 9d306b5commit 7c32834commit 35257aacommit 5afcb90、 ...、commit b2172fd (07 Jul 2015)、commit af83baf (09 Jul 2015) by Karthik Nayak ( KarthikNayak)を参照してください。
( 2015 年 10 月 5 日にコミット 9958dd8Junio C Hamanogitsterによってマージされました)

git tag -l「 」と「 」の一部の機能が「 」git branch -lで利用できるようにgit for-each-refなったため、最終的には 3 つすべてで統一された実装を共有できるようになりました。

* kn/for-each-tag-branch:
  for-each-ref: add '--contains' option
  ref-filter: implement '--contains' option
  parse-options.h: add macros for '--contains' option
  parse-option: rename parse_opt_with_commit()
  for-each-ref: add '--merged' and '--no-merged' options
  ref-filter: implement '--merged' and '--no-merged' options
  ref-filter: add parse_opt_merge_filter()
  for-each-ref: add '--points-at' option
  ref-filter: implement '--points-at' option  
于 2015-10-07T09:16:24.027 に答える
0

解決策の1つは、あまりエレガントではないかもしれませんが、非常に信頼できると思います。すべてのブランチをリストしてから、 ==branch --contains $shaかどうかを確認することです。git rev-parse $branch$sha

于 2013-09-30T18:07:40.527 に答える