1

私のWebサイトには、ベアリポジトリ(プッシュ先)と、ドキュメントルートとして機能する作業ディレクトリを持つクローンがあります。

post-receive裸のリポジトリで、Web サイトを自動更新するフックをセットアップしました。

#!/bin/sh
WEB_DIR=/var/www/www.mysite.com

# remove any untracked files and directories
git --work-tree=${WEB_DIR} clean -fd

# force checkout of the latest deploy
git --work-tree=${WEB_DIR} checkout --force

残念ながら、ベア リポジトリにプッシュした後、変更はドキュメントルートに表示されますが、ステージングされていない変更として表示されます。git checkout -- <files>次に、 a の後に aを実行して、すべてをクリーンアップする必要がありgit pullます。

明らかに、これはそのままで機能するという考えです。クリーンアップとプルを手動で行う必要がある場合は、post-receiveフックを削除することもできます。

さまざまな場所でプルするよりも、ポストレシーブでチェックアウトを使用する方が良いと読んだので、それが良い変更になるかどうかはわかりません...

私は git の専門家ではないので、誰かが私に欠けているものを教えてくれることを願っていますか? 解決策は、いくつかのチュートリアルで見つけたので、多くの人にとってうまくいくようです。

4

1 に答える 1

0

それは紛らわしい

だから今あなたが持っているのは(例)です:

/repos
    /mysite
        /.git 
            ...
/var
    /www
        /www.mysite.com
            /.git
                ...
            index.htm
            ...

奇妙なことは何もありません。ただし、使用中のフックが一致していないため、作業コピーの git リポジトリがチェックアウトされたファイルと同期されていません。

/repos
    /mysite
        /.git <- This git dir
            ...
/var
    /www
        /www.mysite.com <- This working copy
            index.htm
            ...

作業コピーの git ディレクトリ無視されます。これは非常に混乱を招きます。作業コピー ファイルは、作業コピー自体の git 情報を無視して、ベア リポジトリの状態と一致するようにチェックアウトされます。

それを簡単に

その代わりに、次のようなことを行います。

#!/bin/sh
# see http://serverfault.com/q/107608/108287
# for why you can't just run git pull with no arguments

WEB_DIR=/var/www/www.mysite.com

cd $WEB_DIR

# Remove the comments after verifying that it works to reduce noise
git --git-dir $WEB_DIR/.git fetch # > /dev/null
git --git-dir $WEB_DIR/.git checkout --force # > /dev/null
git --git-dir $WEB_DIR/.git clean -fd # > /dev/null

つまり、裸のリポジトリにプッシュしてから、手動で行うことを正確にシミュレートし、ディレクトリのプルとクリーンを変更します。これにより、作業コピーのファイルgit リポジトリが更新され、同期がとれます。

于 2014-06-20T09:08:53.027 に答える