件名に質問に対する正しい答え:
GitオブジェクトSHA-1はファイルの内容またはファイル名ですか?
は、元のファイルではなく緩いオブジェクトファイルの内容を参照していた可能性があります。元のファイルを参照していても、それはまだ正しくありません。
ルースオブジェクトは、Gitでプレーンファイルです。ファイルの名前は、オブジェクトのハッシュIDから作成されます。オブジェクトのハッシュIDは、オブジェクトの内容のハッシュを計算し、プレフィックスヘッダーがになるように構成されます。
プレフィックス付きヘッダーは、オブジェクトの種類によって異なります。blob
、commit
、tag
、およびtree
の4種類があります。ヘッダーは、タイプ名からASCII(またはそれに相当するUTF-8)バイト文字列で構成されたゼロ終端のバイトストリングと、その後に続くスペースと、バイト単位のオブジェクトのサイズの10進数表現ASCII NUL(Pythonでb'\x00'
、現代のPython表記を使用する場合は'\0'
)を使用してください。
ヘッダーの後に実際のオブジェクトの内容が来ます。だから、バイト列b'hello\n'
を含むファイルに対して、ハッシュされるデータはb'blob 6\0hello\n
から成る:
$ echo 'hello' | git hash-object -t blob --stdin
ce013625030ba8dba906f756967f9e9ca394464a
$ python3
[...]
>>> import hashlib
>>> s = b'blob 6\0hello\n'
>>> hashlib.sha1(s).hexdigest()
'ce013625030ba8dba906f756967f9e9ca394464a'
したがって、このファイルを格納するために使用されるファイル名はce013625030ba8dba906f756967f9e9ca394464a
(由来)されます。緩いオブジェクトとしては、.git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
になります。
内容そのファイルのは、しかし、明らかに、level=1
-theのデフォルトは現在6で、結果はそのレベルで一致していない(とb'blob 6\0hello\n'
のzlibの圧縮形式であり、それはGitリポジトリのzlibのかどうかは明らかではありません正確に)Pythonのと一致しますが、ここで働いたレベル1を使用して収縮:
は
$ echo 'hello' | git hash-object -w -t blob --stdin
ce013625030ba8dba906f756967f9e9ca394464a
$ vis .git/objects/ce/013625030ba8dba906f756967f9e9ca394464a
x\^AK\M-J\M-IOR0c\M-HH\M-M\M-I\M-I\M-g\^B\000\^]\M-E\^D\^T$
(最終$
は、シェルが再びプロンプトであることに注意してください。すぐに戻って
>>> import zlib
>>> zlib.compress(s, 1)
b'x\x01K\xca\xc9OR0c\xc8H\xcd\xc9\xc9\xe7\x02\x00\x1d\xc5\x04\x14'
>>> import vis
>>> print(vis.vis(zlib.compress(s, 1)))
x\^AK\M-J\M-IOR0c\M-HH\M-M\M-I\M-I\M-g\^B\^@\^]\M-E\^D\^T
)のpython3に
vis.py
である:
def vischr(byte):
"encode characters the way vis(1) does by default"
if byte in b' \t\n':
return chr(byte)
# control chars: \^X; del: \^?
if byte < 32 or byte == 127:
return r'\^' + chr(byte^64)
# printable characters, 32..126
if byte < 128:
return chr(byte)
# meta characters: prefix with \M^ or \M-
byte -= 128
if byte < 32 or byte == 127:
return r'\M^' + chr(byte^64)
return r'\M-' + chr(byte)
def vis(bytestr):
"same as vis(1)"
return ''.join(vischr(c) for c in bytestr)
(vis
バイナリファイルの可逆が、印刷可能な符号を生成します。 cat -v
の問題に対する私の1993年の答えです)。 (コミット下)Gitのリポジトリに格納されたファイルの名は、個々のtree
オブジェクトに保存されているだけとして、パス名コンポーネントを表示さ
注意。ツリーオブジェクトのハッシュIDを計算することは重要ではありません。私はgithash.pyの私の公開 "スクリプト"リポジトリでこれを行うPythonコードを持っています。
https://git-scm.com/book/en/v2/Git-Internals-Git-Objects –
これは私が今行っていることですが、ファイル内容の部分ではまだ分かりません。ここをクリックしてください。 – appu
あなたの質問を編集して、そのリンクの「Object Storage」ヘッダーの説明の特定の側面について理解することはできますか? – jthill