[解決済み] Git の SHA1 をファイルに割り当てるには?
2022-05-17 21:23:37
質問
私の理解では、Git がファイルに SHA1 ハッシュを割り当てるとき、この SHA1 はファイルの内容に基づいてそのファイルに固有のものです。
その結果、あるファイルがあるリポジトリから別のリポジトリに移動しても、そのファイルのSHA1は、そのコンテンツが変更されていないため、同じままです。
GitはどのようにSHA1ダイジェストを計算するのですか?圧縮されていない完全なファイルの内容に対して行うのでしょうか?
Gitの外部でSHA1を割り当てることをエミュレートしたいのですが。
どのように解決するのですか?
これは、Gitがファイル(Git用語では"blob")に対してSHA1を計算する方法です。
sha1("blob " + filesize + "\0" + data)
というわけで、Gitをインストールしなくても自分で簡単に計算することができます。なお、" \0" はNULLバイトであり、2文字の文字列ではありません。
例えば、空のファイルのハッシュです。
sha1("blob 0\0") = "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391"
$ touch empty
$ git hash-object empty
e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
もう一つの例
sha1("blob 7\0foobar\n") = "323fae03f4606ea9991df8befbb2fca795e648fa"
$ echo "foobar" > foo.txt
$ git hash-object foo.txt
323fae03f4606ea9991df8befbb2fca795e648fa
Pythonの実装を紹介します。
from hashlib import sha1
def githash(data):
s = sha1()
s.update("blob %u\0" % len(data))
s.update(data)
return s.hexdigest()
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Gitブランチをローカルやリモートで削除するには?
-
[解決済み] git pull」と「git fetch」の違いは何ですか?
-
[解決済み] コミット前に 'git add' を取り消すにはどうすればよいですか?
-
[解決済み] リモートのGitブランチをチェックアウトするには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】ローカルのGitブランチの名前を変更するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 現在のブランチのトラッキング情報がありません。
-
[解決済み】Gitのエラー。リモートリポジトリへの接続時に「Host Key Verification Failed」。
-
[解決済み】git rev-parseは何をするのですか?
-
[解決済み] [email protected] へのいくつかの参考文献のプッシュに失敗しました。
-
[解決済み] git rebase fatal: 必要なリビジョンは1つです。
-
[解決済み】Git Push Error: リポジトリデータベースにオブジェクトを追加する権限が不足しています。
-
[解決済み] TortoiseGitで「git did not exit cleanly (exit code 128)」というエラーを解決するには?[クローズド]
-
[解決済み] Git エラー : 'upstream' は git リポジトリでないようです。
-
[解決済み] リモートブランチにプッシュできない、ブランチに解決できない
-
[解決済み] git はどのようにファイルのハッシュを計算するのですか?