45

次のファイルをインデックスに追加しました。

git add somefile.txt

次に、このファイルのSHA1を次のように取得しました。

git hash-object somefile.txt

これでSHA1ができましたが、SHA1を使用してインデックス内のオブジェクトのファイル名を取得したいと思います。

git show 5a5bf28dcd7944991944cc5076c7525439830122

このコマンドはファイルの内容を返しますが、ファイルの名前は返しません。

SHA1から完全なファイル名とパスを取得するにはどうすればよいですか?

4

5 に答える 5

36

ファイルの名前は、ファイルの内容である blob オブジェクトではなく、ファイルを含むツリー オブジェクトの一部であるため、git にはそのような直接マッピングはありません。

SHA1 ハッシュからファイル名を取得するのは通常の操作ではないので、実際の使用例を拡張できますか?

現在のファイル (つまり、HEAD コミット) を見ている場合は、次のことを試すことができます。

git ls-tree -r HEAD | grep <SHA1>

以前のコミットの内容を見つけたい場合は、さらにこのようなことをする必要があります。

git rev-list <commit-list> | \
xargs -n1 -iX sh -c "git ls-tree -r X | grep <SHA1> && echo X"
于 2009-01-20T07:59:54.877 に答える
31

これを行うための優れたワンライナー:

git rev-list --objects --all | grep <blob sha1>
于 2014-05-23T21:30:31.863 に答える
8

次のシェル スクリプトは、 Which commit has this blob?に大きく基づいています。そして、アリストテレス・パガルツィスによって提供された答え。

#!/bin/sh

obj_hash=$1

# go over all trees
git log --pretty=format:'%T %h %s' \
| while read tree commit subject ; do
     git ls-tree -r $tree | grep  "$obj_hash" \
     | while read a b hash filename ; do
        if [ "$hash" == "$obj_hash" ]; then
          f=$filename
          echo $f
          break
        fi
        if $f ; then break; fi
      done
      if $f; then break; fi
done

誰かがこのスクリプトを美化できると確信していますが、うまくいきます。アイデアは、コミットされたすべてのツリーを見て、特定のハッシュを検索することです。

于 2009-01-20T08:01:42.767 に答える
3

git rev-list <commit-list>たとえば、によって削除されrebase -i、現在はreflogによってのみ参照されているコミットは含まれません。したがって、上記のコマンドでblobが見つからない場合は、次のようにreflogも確認する必要があります。

git reflog --all | \
cut -d\  -f1 | \
xargs -n1 -iX sh -c "git ls-tree -r X | grep <BLOB_SHA> && echo X"
于 2011-11-18T20:58:08.950 に答える
-1

ファイルをコミットし、コミット オブジェクトの sha1 ハッシュをメモします。その後の使用

git ls-tree <commit-sha1>

ハッシュを使用してファイルの名前を取得します。

その他のオプションについては、マニュアル ページを確認してください。

于 2009-01-20T07:54:23.187 に答える