7

Git ワークフローの基本的なセットアップは、2 人の開発者がプッシュ/プルするローカル ネットワーク サーバー上のベア リポジトリです。

ローカル ネットワーク サーバー上の別の場所にプッシュされる各ブランチを自動的にコピー (チェックアウト) したいと考えています。例を挙げると:

「develop」ブランチのコピーを「develop」サブフォルダーにプッシュします。「マスター」ブランチのコピーを「マスター」サブフォルダーにプッシュします。

私たちが抱えている問題は、これを行うために post-receive フックを取得することです。ここに私たちが現在持っているものがあります:

#!/bin/bash

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

  if [ "master" == "$branch" ]; then
    GIT_WORK_TREE=/master
    git checkout -f $branch
    echo 'Changes pushed master.'
  fi

  if [ "develop" == "$branch" ]; then
    GIT_WORK_TREE=/develop
    git checkout -f $branch
    echo 'Changes pushed to develop.'
  fi
done

受け取ったエラーは次のとおりです。

「リモート: 致命的: この操作は作業ツリーで実行する必要があります。リモート: 変更がプッシュされて展開されました。」

そのエラーから予想されるように、実際には何もチェックアウトされていません。

この方法でポストレシーブも試しましたが、同じ問題がありました:

#!/bin/bash

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

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

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

ここで私が間違っていることを誰か説明してもらえますか (3 歳児のように説明してください :))。ありがとう。

将来の読者のために答えをより明確にするために、トレックはそれを頭にぶつけました. --work-tree=/masterベアレポのルート内にある「マスター」というフォルダーにアクセスしようとして使用していました(たとえば、「ブランチ」、「フック」などと並んで)。これを--work-tree=./master(スラッシュの前のドットに注意してください)に変更するとすぐに、すべてが期待どおりに機能しました。

4

2 に答える 2

3

/master/developが存在しないディレクトリであるため、これを取得しています。

$ git --work-tree=/nonexistent checkout master
fatal: This operation must be run in a work tree

また、このアプローチで発生する別の問題についての質問に対する私の回答も参照してください。これは、人気があるが間違った受信後テクニック (cut更新された参照)。

--bare[あなたの言い回しは、プッシュを受信して​​いる(おそらく) リポジトリ内のサブディレクトリにこれら 2 つのブランチをデプロイすることを考えているのかも疑問に思います。これはおそらく良い考えではありません。]

展開するための別の (別の) 方法は、展開場所に「実際の」git ツリーを配置することです。次に、代わりに次のgit --work-tree=... checkoutようなことを行います。

deploy()
{
    local path=$1 branch=$2

    (cd $path && unset GIT_DIR && git fetch && git checkout -f origin/$branch)
}

(未テスト、自由に実験および/または変更してください)。これには、ディスク容量と更新ウィンドウに関して、わずかに異なるトレードオフがあります(他の回答で言及しています)。

于 2013-10-09T11:57:38.660 に答える