2319

Git チェンジセットを TFS に保存されたワークアイテムにリンクする機能を (今のところ) 保持したいと思います。

Git チェンジセットのメッセージに作業項目識別子を挿入できるツールを (Git のフックを使用して) 既に作成しました。

また、Git コミットのハッシュをカスタム TFS ワークアイテム フィールドに保存したいと考えています。このようにして、TFS でワークアイテムを調べ、どの Git 変更セットがワークアイテムに関連付けられているかを確認できます。

Git から現在のコミットからハッシュを簡単に取得するにはどうすればよいですか?

4

22 に答える 22

3399

任意の拡張オブジェクト参照を SHA-1 に変換するには、単純にgit-rev-parseを使用します。たとえば、

git rev-parse HEAD

また

git rev-parse --verify HEAD

このような短いバージョンを取得することもできます

git rev-parse --short HEAD

補足:参照(ブランチタグ) を SHA-1 に変換したい場合git show-refありgit for-each-refます。

于 2009-06-04T09:05:57.627 に答える
496

短縮されたコミット ハッシュのみが必要な場合:

git log --pretty=format:'%h' -n 1

さらに、 を使用%Hすることは、ロング コミット ハッシュを取得する別の方法であり、単純-1に の代わりに使用できます-n 1

于 2011-09-30T23:32:09.467 に答える
180

git log を使用した別の方法:

git log -1 --format="%H"

@outofculture の と非常に似ていますが、少し短いです。

于 2011-11-21T18:48:18.153 に答える
78

完全を期すために、まだ誰も提案していないので. .git/refs/heads/masterは 1 行のみを含むファイルです: での最新のコミットのハッシュですmaster。ですから、そこから読むことができます。

または、コマンドとして:

cat .git/refs/heads/master

アップデート:

git は、いくつかの head ref を /refs/heads/ フォルダー内のファイルとしてではなく、pack-ref ファイルに格納することをサポートするようになったことに注意してください。 https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html

于 2012-10-16T11:34:36.190 に答える
59

こちらもいつもありgit describeます。デフォルトでは、それはあなたに与えます-

john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always
release-0.19-11-g7a68a75
于 2011-08-26T10:43:43.283 に答える
35

使用するgit rev-list --max-count=1 HEAD

于 2009-06-04T08:48:11.670 に答える
27

スクリプト中に変数にハッシュを格納する必要がある場合は、次を使用できます

last_commit=$(git rev-parse HEAD);

または、最初の 10 文字だけが必要な場合 (github.com のように)

last_commit=$(git rev-parse --short=10 HEAD);
于 2012-07-15T16:04:21.593 に答える
20

あなたがそれを行うための非常にハックな方法が必要な場合:

cat .git/`cat .git/HEAD | cut -d \  -f 2`

基本的に、git は HEAD の場所を .git/HEAD の形式で保存しますref: {path from .git}。このコマンドはそれを読み取り、「ref:」をスライスして、それが指しているファイルを読み取ります。

もちろん、HEAD は "ref:..." ではなく、ハッシュ自体になるため、これはデタッチド ヘッド モードでは失敗します。 -ライナー。ただし、セミコロンがごまかしていると思わない場合は...

HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \  -f 2)")"; done; echo $HASH
于 2015-10-14T19:15:46.893 に答える
15

気の利いた詳細をすべて覚える必要がないように、エイリアスが必要な場合もあります。以下の手順のいずれかを実行すると、次のように入力するだけで済みます。

$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630

受け入れられた回答をフォローアップすると、これを設定する2つの方法があります。

1)グローバル設定を編集して明示的な方法でgitに教えます(私の元の答え):

 # open the git config editor
 $ git config --global --edit
 # in the alias section, add
 ...
 [alias]
   lastcommit = rev-parse HEAD
 ...

2) または、最近 Adrien がコメントしたように、git にショートカットを教えるショートカットが好きな場合:

$ git config --global alias.lastcommit "rev-parse HEAD"

git lastcommitこれ以降、最後のコミットのハッシュを表示するために使用します。

于 2015-10-09T12:53:46.470 に答える
10

git rev-parse HEADトリックを行います。

実際のブランチを保存するよりも後でチェックアウトするために保存する必要がある場合は、次のようにします。

cat .git/HEAD

出力例:

ref: refs/heads/master

解析します:

cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"

Windows を使用している場合は、wsl.exe の使用を検討してください。

wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"

出力:

refs/heads/master

この値は後で git checkout に使用される可能性がありますが、その SHA を指すようになります。その名前で実際の現在のブランチを指すようにするには、次のようにします。

wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g"  | wsl sed "s/^heads\///g"

出力:

master
于 2019-11-04T16:12:28.653 に答える
8
git show-ref --head --hash head

ただし、スピードを重視する場合は、ディースタンが言及したアプローチ

cat .git/refs/heads/<branch-name>

ここにリストされている他のどの方法よりも大幅に高速です。

于 2015-04-30T07:06:10.137 に答える
0

別の直接アクセスの実装を次に示します。

head="$(cat ".git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(cat ".git/${head#ref: }")"
done

これは、ローカル パッケージ アーカイブに便利な http でも機能します (公開 Web サイトでは、.git ディレクトリにアクセスできるようにすることはお勧めしません)。

head="$(curl -s "$baseurl/.git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
  head="$(curl -s "$baseurl/.git/${head#ref: }")"
done
于 2016-11-04T13:20:31.623 に答える