3

サーバーに裸の git リポジトリを作成し、このブログから次の post-receive フックを設定しました。

#!/bin/bash

while read oldrev newrev ref
do
  branch=`echo $ref | cut -d/ -f3`

  if [ "master" == "$branch" ]; then
    git --work-tree=/path/to/my/project/live/ checkout -f $branch
    echo 'Changes pushed live.'
  fi

  if [ "develop" == "$branch" ]; then
    git --work-tree=/path/to/my/project/dev/ checkout -f $branch
    echo 'Changes pushed to dev.'
  fi
done

サーバーにローカルにプッシュするたびに、手動でプルする必要なく、変更が各ブランチのフォルダーに自動的に公開されるようにします。

私は適切なアクセス許可を両方とも dev フォルダーに設定しました。

drwxrwsr-x 2 git git 4096 Sep 29 12:10 live/
drwxrwsr-x 2 git git 4096 Sep 29 12:09 dev/

そして、開発ブランチからのプッシュは期待どおりに機能します。master ブランチをチェックアウトしてマージすると、問題が発生します。マスターをプッシュすると、新しいファイルがサーバーのライブ フォルダーにコピーされますが、ローカルで削除したファイルは削除されません。

受信後、ライブ フォルダを適切に更新するにはどうすればよいですか? ありがとう!

4

2 に答える 2

4

私は同じ問題に遭遇しました。tmp フォルダー ファイルを live フォルダーにコピーするために rsync を調べていましたが、作業ツリーで git glean を使用しない理由がわかりました。

これが悪いかどうかはわかりませんが、フォルダーから追跡されていないファイルのみを削除し、.gitignore 設定を使用して、リポジトリにないファイルを削除しないようにする必要があります。

プッシュによって削除されなかった残りのファイルをクリアするという、私が望むことを達成しているようです。

#!/bin/sh
while read oldrev newrev refname
do
    branch=$(git rev-parse --symbolic --abbrev-ref $refname)
    if [ "master" == "$branch" ]; then
        GIT_WORK_TREE=/home/store/public_html git checkout -f master
        GIT_WORK_TREE=/home/store/public_html git clean -fd
    fi
    if [ "test" == "$branch" ]; then
        GIT_WORK_TREE=/home/store/test_html git checkout -f test
        GIT_WORK_TREE=/home/store/test_html git clean -fd
    fi
    if [ "dev" == "$branch" ]; then
        GIT_WORK_TREE=/home/store/dev_html git checkout -f dev
        GIT_WORK_TREE=/home/store/dev_html git clean -fd
    fi
done
于 2015-11-27T17:02:51.140 に答える