web-dev-qa-db-ja.com

Gitで現在のコミットのハッシュを取得する方法

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

私はすでにGitチェンジセットのメッセージにworkitemidentifierを入れることができるツールを(Gitのフックを使って)書いています。

ただし、Gitコミットの識別子(ハッシュ)もカスタムTFS作業項目フィールドに格納したいと思います。このようにして、TFSで作業項目を調べ、そのGITチェンジセットがその作業項目に関連付けられていることを確認できます。

Gitの現在のコミットからハッシュを簡単に取得する方法はありますか。

1646
Sardaukar

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

git rev-parse HEAD

または

git rev-parse --verify HEAD

Sidenote:references branches tags )をSHA-1に変換したい場合は、 git show-refgit for-each-ref

2409
Jakub Narębski

短縮ハッシュだけが欲しい場合:

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

さらに、%Hを使用することは、長いハッシュを取得するための別の方法です。

373
outofculture

もう1つ、git logを使用します。

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

少し短くなりますが、@ outofcultureとよく似ています。

126
Paul Pladijs

完全なSHAを取得するには

$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537

短縮版を入手するには:

$ git rev-parse --short HEAD
cbf1b9a
82
Alexander

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

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

cat .git/refs/heads/master

更新:

Gitは/ refs/heads /フォルダ内のファイルとしてではなく、pack-refファイル内のいくつかのhead refの保存をサポートするようになりました。 https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html

65
Deestan

常にgit describeもあります。デフォルトではそれはあなたを与えます -

john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always
release-0.19-11-g7a68a75
42
John Tyree

ハッシュをコミット

git show -s --format=%H

省略されたコミットハッシュ

git show -s --format=%h

その他のgit showの例については、 ここ をクリックしてください。

34
ecwpz91

git rev-list --max-count=1 HEADを使う

27
Robert Munteanu

スクリプトの実行中にハッシュを変数に格納する必要がある場合は、

last_commit=$(git rev-parse HEAD)

あるいは、最初の10文字だけが欲しい場合(github.comのように)

last_commit=$(git rev-parse HEAD | cut -c1-10) 
20
Henk

私が知っている最も簡潔な方法:

git show --pretty=%h 

ハッシュの特定の桁数が必要な場合は、追加できます。

--abbrev=n
14
Brian Peterson

おそらくあなたはエイリアスが欲しいので、気の利いた詳細をすべて覚えておく必要はありません。以下のステップの1つを実行した後は、単純に入力することができます。

$ 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を使用してください。

12
miraculixx

あなたがそれをするための超ハックな方法が欲しいならば:

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

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

HEADは "ref:..."にはならないので、もちろんこれはdetached-headモードでは失敗しますが、ハッシュ自体はそうです - しかしあなたはそれを期待していないと思いますあなたのbashのワンライナーの多くの賢い。セミコロンが不正だとは思わないのであれば、でも….

HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \  -f 2)")"; done; echo $HASH
11
Fordi

もう少し違うものが必要でした。コミットの全文を表示しますが、作業ディレクトリがきれいでない場合は最後にアスタリスクを追加します。複数のコマンドを使用したくない限り、前の回答のオプションはどれも機能しません。

これが行う1つのライナーです。
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
結果:f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*

説明:現在のコミットを(注釈付きタグを使用して)説明しますが、 "NOT A TAG"を含むタグのみを使用します。タグにスペースを含めることはできないので、これはタグには一致しません。結果--alwaysを表示したいので、コマンドはコミットの完全な(--abbrev=0)sha1の表示に戻り、作業ディレクトリが--dirtyの場合はアスタリスクを追加します。

アスタリスクを追加したくない場合は、これまでの回答の他のすべてのコマンドと同じように機能します。
git describe --always --abbrev=0 --match "NOT A TAG"
結果:f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe

8
Rado
git show-ref --head --hash head

あなたがスピードを求めているのであれば、 Deestanが述べているアプローチ

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

これまでに挙げた他の方法よりもはるかに高速です。

6
Dennis

これはgitファイルからの直接読み込みを使ったBashシェルのワンライナーです。

(head=($(<.git/HEAD)); cat .git/${head[1]})

Gitのルートフォルダで上記のコマンドを実行する必要があります。

この方法はリポジトリファイルがある場合には便利ですが、gitコマンドはインストールされていません。

うまくいかない場合は、.git/refs/headsフォルダーにどのようなヘッドがあるのか​​を確認してください。

5
kenorb

あなたのhome-dirの中の ".gitconfig"ファイルに以下を追加してください。

[alias]
sha = rev-parse HEAD

そうすると、覚えやすい簡単なコマンドになります。

$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600
2
jo_

これを:)で実行する別の方法があります。

git log | grep -o '\w\{8,\}' | head -n 1
1

もう1つの直接アクセスの実装は次のとおりです。

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
0
Daniel Alder