1

これは一種の奇妙なものであり、私の特定の状況以外にあまり適用されない場合は、事前にお詫び申し上げます. 私は git を使用して、展開に関連する一連の生成されたファイルとリリース コードを指すサブモジュールをコミットしてタグ付けすることにより、展開パッケージを管理しています。各マシンの裸のリポジトリから別の空のディレクトリに、この展開タグの git チェックアウトを実行しようとしています。取得した出力は、作成する必要のあるファイルを削除したことを示しており、その後、作業ツリー ディレクトリは空のままです。

$ ls -al /var/www/test/
total 0

$ git --bare --work-tree=/var/www/test/ checkout my_tag
D   .gitmodules
D   generated.tgz
D   release
D   signatures.md5
HEAD is now at 8946ff5... Generated contents of deployment package.

$ ls -al /var/www/test/
total 0

my_tag によって参照されるコミットと master のヒントの両方に同じ 4 つのファイルがあることを述べておく必要があります (ただし、内容は異なります)。これにより、次の手順で 75% の結果が得られることは非常に奇妙です。

$ git --bare --work-tree=/var/www/test/ checkout master
D   .gitmodules
Previous HEAD position was 8946ff5... Generated contents of deployment package.
Switched to branch 'master'

$ ls -al /var/www/test/
total 4
-rw-r--r-- 1 root root    0 Oct 17 17:00 generated.tgz
drwxr-xr-x 2 root root 4096 Oct 17 17:00 release
-rw-r--r-- 1 root root    0 Oct 17 17:00 signatures.md5

$ git --bare --work-tree=/var/www/test/ checkout my_tag
D   .gitmodules
(---- git's warning about detached HEAD state cut ----)
HEAD is now at 8946ff5... Generated contents of deployment package

$ ls -al /var/www/test/
total 4624
-rw-r--r-- 1 root root 2103765 Oct 17 17:02 generated.tgz
drwxr-xr-x 2 root root    4096 Oct 17 17:00 release
-rw-r--r-- 1 root root 2614883 Oct 17 17:02 signatures.md5

問題は、「リリース」は git サブモジュールであり、.gitmodules なしでは初期化または更新できないため、75% の方法ではまだ十分ではありません。

この問題の解決策の 1 つは、デプロイするたびにレポジトリを新しく複製することです。誰もより良い解決策を提案できない場合は、その方法で行くかもしれません。しかし、理想的には、各マシンに 1 つのベア レポを保持し、そこから毎回新しいワーク ツリーにチェックアウトしたいと考えています。ここで何が起こっているのか誰か教えてもらえますか?

参考までに、Git 1.8.2.1 を使用しています。

4

1 に答える 1

0

基本的な問題はcheckout、目的のリビジョン ( my_tagmaster) をレポの内容HEAD--bare比較することです。(そして、--bare引数は何もしていません。) したがって、my_tagでは、既に切り離されHEADたモードにあり、目的のリビジョンにいる (つまり、変更してはならない) ことHEADを示し、ターゲット ディレクトリ を調べて/var/www/test/、ファイルが削除されていることを確認します。それぞれのDステータスが表示されます。インデックスのためにそれらがそこにあったと想定しています(以下を参照)。

に切り替えるとcheckout master、次のように表示されます: OK、このデタッチドHEADからmasterに移動します。変更されたファイルを更新HEADしてチェックアウトします。しかし、と.gitmodulesは同じなので、一方は削除されたままです。my_tagheadD

を使用するcheckout -fと、不足しているファイルを置き換える必要があると想定されます。

Git には悪い癖もあります :-) を使用$GIT_DIR/indexして、チェックアウトで行っていることを記録するだけでなく、$GIT_DIR/HEAD. これにより、展開しようとしているものからファイルが削除されると、ファイルが取り残されます。ただし、実行する前にターゲットディレクトリが空になっている場合はcheckout -f問題ありません。(または、GIT_INDEX_FILE環境に設定し、独自の展開ごとに保持するファイルに名前を付けます。私はこれを試していませんが、うまくいくはずです。)

于 2013-10-17T23:22:10.810 に答える