私は(今のところ)GitチェンジセットをTFSに格納されているワークアイテムにリンクする機能を保持したいと思います。
私はすでにGitチェンジセットのメッセージにworkitemidentifierを入れることができるツールを(Gitのフックを使って)書いています。
ただし、Gitコミットの識別子(ハッシュ)もカスタムTFS作業項目フィールドに格納したいと思います。このようにして、TFSで作業項目を調べ、そのGITチェンジセットがその作業項目に関連付けられていることを確認できます。
Gitの現在のコミットからハッシュを簡単に取得する方法はありますか。
任意の拡張オブジェクト参照をSHA-1に変換するには、単純にgit-rev-parseを使用します。
git rev-parse HEAD
または
git rev-parse --verify HEAD
Sidenote:references( branches と tags )をSHA-1に変換したい場合は、 git show-ref
とgit for-each-ref
。
短縮ハッシュだけが欲しい場合:
git log --pretty=format:'%h' -n 1
さらに、%Hを使用することは、長いハッシュを取得するための別の方法です。
もう1つ、git logを使用します。
git log -1 --format="%H"
少し短くなりますが、@ outofcultureとよく似ています。
完全なSHAを取得するには
$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537
短縮版を入手するには:
$ git rev-parse --short HEAD
cbf1b9a
完全性のために、誰もまだそれを提案していないので。 .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
常にgit describe
もあります。デフォルトではそれはあなたを与えます -
john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always
release-0.19-11-g7a68a75
ハッシュをコミット
git show -s --format=%H
省略されたコミットハッシュ
git show -s --format=%h
その他のgit show
の例については、 ここ をクリックしてください。
git rev-list --max-count=1 HEAD
を使う
スクリプトの実行中にハッシュを変数に格納する必要がある場合は、
last_commit=$(git rev-parse HEAD)
あるいは、最初の10文字だけが欲しい場合(github.comのように)
last_commit=$(git rev-parse HEAD | cut -c1-10)
私が知っている最も簡潔な方法:
git show --pretty=%h
ハッシュの特定の桁数が必要な場合は、追加できます。
--abbrev=n
おそらくあなたはエイリアスが欲しいので、気の利いた詳細をすべて覚えておく必要はありません。以下のステップの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
を使用してください。
あなたがそれをするための超ハックな方法が欲しいならば:
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
もう少し違うものが必要でした。コミットの全文を表示しますが、作業ディレクトリがきれいでない場合は最後にアスタリスクを追加します。複数のコマンドを使用したくない限り、前の回答のオプションはどれも機能しません。
これが行う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
git show-ref --head --hash head
あなたがスピードを求めているのであれば、 Deestanが述べているアプローチ
cat .git/refs/heads/<branch-name>
これまでに挙げた他の方法よりもはるかに高速です。
これはgitファイルからの直接読み込みを使ったBashシェルのワンライナーです。
(head=($(<.git/HEAD)); cat .git/${head[1]})
Gitのルートフォルダで上記のコマンドを実行する必要があります。
この方法はリポジトリファイルがある場合には便利ですが、git
コマンドはインストールされていません。
うまくいかない場合は、.git/refs/heads
フォルダーにどのようなヘッドがあるのかを確認してください。
あなたのhome-dirの中の ".gitconfig"ファイルに以下を追加してください。
[alias]
sha = rev-parse HEAD
そうすると、覚えやすい簡単なコマンドになります。
$ git sha
59fbfdbadb43ad0b6154c982c997041e9e53b600
これを:)で実行する別の方法があります。
git log | grep -o '\w\{8,\}' | head -n 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