私はプッシュだけを受け取る裸のレポを持っています。そのようなプッシュが行われると、その変更が裸のレポによって別の場所(クローンではなく、.gitフォルダのない静的な場所)に反映されるようにしたいと思います。Git:裸のレポは、他の非gitの場所を追跡できますか?もしそうなら、どうですか?
これは可能ですか?
私はプッシュだけを受け取る裸のレポを持っています。そのようなプッシュが行われると、その変更が裸のレポによって別の場所(クローンではなく、.gitフォルダのない静的な場所)に反映されるようにしたいと思います。Git:裸のレポは、他の非gitの場所を追跡できますか?もしそうなら、どうですか?
これは可能ですか?
誰かがプッシュするたびに何らかのアクションを実行するには、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
を追加することです。
ブライアンと合意。しかし、ユースケースは何ですか?変更を追跡したい場合、なぜクローンを実行したくないのですか?
私はスペースを節約したい。裸のレポのかなりの複製である余分な.gitフォルダを持つことは全体を50%大きくします。また、他の用途もあります.Git以外の場所をネットワークドライブにマッピングすることができます(gitはローカルディレクトリだと思っていますが、実際にはftp経由でサーバーに送られます)。 – trusktr
ニース。 'git archive master'はマスターからツリー全体をアーカイブに入れますか?もしそうならば、私はoldrevからnewrevに更新されたファイルを、ファイル構造全体ではなく、どうすれば得ることができますか? – trusktr
変更/追加されたファイルだけを取得する方法があれば、それは素晴らしいです。 – trusktr
@trusktrはい、 'git archive master'はtarアーカイブを作成するだけです。作成したい場所に展開します。私は、変更されたファイルを書くだけではなく、なんらかの理由でスクリプトが一回押すのに失敗した場合はどうすればよいでしょうか?それらのファイルは書き込まれませんし、次のプッシュでは異なるファイルが含まれていると同期がとれません。あなたが実際に変更されたファイルだけを書き出したいのであれば、 'git diff $ old $ new |パッチ-p1 -d/path/to/expand/into'を実行します。 –