2012-04-20 11 views
2

変更をコミットする前に、ファイル(または理想的にはツリー)の新しいgit shaを判断する方法はありますか?git:プリコミットフックでオブジェクトshasを使用する

背景:

私は自動的に一意の値、レポの別のディレクトリ内のファイルが変更されるたびに私のレポで1つのファイルに文字列を変更しようとしています。

これを行う簡単な方法は、サブディレクトリツリーのshaを一意の文字列として使用するgitフックを書くことだと考えていました。これはgit ls-treeでコミット後のフックとして行うのが簡単なようですが、余分なダミーコミットが毎回文字列をコミットして余分なノイズを生成する必要があります。

これまではgit hash-objectを実行することでこれが可能であると判断しましたが、最終的に計算するためにディレクトリ内のファイルのハッシュを再帰的に構築するためには、ディレクトリ(ツリー)のハッシュ私は、より単純なオプションがあるのだろうかと思っています。

+1

これを行う理由を教えてもらえますか?それが問題の解決に役立つかもしれません。あなたがしようとしていることは間違ったことのように聞こえる。 – larsks

+0

これらのファイルには、コードを展開するとき(データが変更された場合)、データベースにアップロードする必要のあるデータが含まれています。しかし、それを原子的にアップロードするために、データはユニークな識別子を使用してバージョン管理されます(コードの残りの部分は、別のファイルに格納されています)。 私は、データファイルの内容に基づいて一意の識別子を自動的に生成するのが便利だと思っていました.git shaはその法案にうまく収まるように思えました。 – agrifolia

答えて

3

正確にはが答えをカバーしていませんが、実際に新しいコミットを最初に作成することなく、ツリーのインデックスをコミットする方法を計算する方法があります。

git write-tree --prefix <subdirectory>/を実行すると、インデックスにあるツリーがディスクに書き出され、ハッシュが返されます。これは、コミットが実行されたときに作成されるオブジェクトとまったく同じです。

+0

優れています。これはうまく動作するはずです。ありがとう。 – agrifolia

0

上記の私のコメントを参照してください...しかし、あなたは、ディレクトリツリーの一意の識別子のいくつかの並べ替えを取得したい場合、あなたはこのような何かを行うことができます:

find directory -type f -print0 | 
    xargs -0 git hash-object | 
    git hash-object --stdin 

これは、内のすべてのファイルのハッシュを計算しますあなたのディレクトリ...そしてハッシュのリストのハッシュを計算してください。

関連する問題