2012-03-12 3 views

答えて

2

誰かがプッシュするたびに何らかのアクションを実行するには、post-receive hookを作成します。それらの変更を裸のリポジトリからGitリポジトリではない別のディレクトリに取得するには、git archiveを作成し、更新する場所に展開する必要があります。 SPは、<old-value><new-value>リビジョンがあるスペース文字です

post-receiveフックは、(次の形式で、標準入力にプッシュだけでなく、彼らの古い値と新しい値で更新されている全ての引用文献のリストを受け取り、そして<ref-name>)が更新された参照です。

<old-value> SP <new-value> SP <ref-name> 

あなたが先ディレクトリへmasterミラーリングで唯一興味があるなら、あなたは、このような行を参照してください場合にのみ、あなたのスクリプトを実行することをお勧めします。

(それを信用する前に、あなたが気にしないテストされていないので、場所でこれを試す)例えば、このようなものは、おそらく動作します:

#!/bin/sh 
while read old new ref; do 
    if [ "$ref" = master ]; then 
     git archive master | tar -x -C /path/to/expand/into 
    fi 
done 

編集:これは持っていることに注意してくださいかなり重大な欠点。ファイルを削除(または移動)しても、コピー先ディレクトリのファイルは削除されません。 1つの潜在的な解決策は、アーカイブ行の前にrm -rf /path/to/expand/into; mkdir /path/to/expand/intoを追加することです。

+0

ニース。 'git archive master'はマスターからツリー全体をアーカイブに入れますか?もしそうならば、私はoldrevからnewrevに更新されたファイルを、ファイル構造全体ではなく、どうすれば得ることができますか? – trusktr

+0

変更/追加されたファイルだけを取得する方法があれば、それは素晴らしいです。 – trusktr

+0

@trusktrはい、 'git archive master'はtarアーカイブを作成するだけです。作成したい場所に展開します。私は、変更されたファイルを書くだけではなく、なんらかの理由でスクリプトが一回押すのに失敗した場合はどうすればよいでしょうか?それらのファイルは書き込まれませんし、次のプッシュでは異なるファイルが含まれていると同期がとれません。あなたが実際に変更されたファイルだけを書き出したいのであれば、 'git diff $ old $ new |パッチ-p1 -d/path/to/expand/into'を実行します。 –

0

ブライアンと合意。しかし、ユースケースは何ですか?変更を追跡したい場合、なぜクローンを実行したくないのですか?

+0

私はスペースを節約したい。裸のレポのかなりの複製である余分な.gitフォルダを持つことは全体を50%大きくします。また、他の用途もあります.Git以外の場所をネットワークドライブにマッピングすることができます(gitはローカルディレクトリだと思っていますが、実際にはftp経由でサーバーに送られます)。 – trusktr