6

これは、規則、ベスト プラクティス、および/または個人的な好みに関する質問である可能性があります。

私は git noob であり、私の Web サイトのコードは共有する価値がないため、github などは使用していません。

git は中央リポジトリを必要としないことを知っていたので、私は考えました。私のワークステーションとサーバーは 2 つのノードであり、私のワークステーションからサーバーに変更をプッシュするだけです。

私が始めたとき、コードはサーバー上にしかなかったので、私は:

  1. サーバー上: git init
  2. ワークステーション:git clone me@myserver:path/to/repo
  3. 陽気に変更を行い、ローカルにコミットしました
  4. ワークステーション:git push me@myserver:path/to/repo

奇妙な結果が得られました。ローカルに追加したファイルはサーバーに表示されましたが、既存のファイルへの変更は反映されませんでした。

次に、チェックアウトされたリモート ブランチへのプッシュに対する警告を読みました。したがって、新しいセットアップは次のとおりです。

  1. 裸のリポジトリgit clone --bareを作るために走った
  2. サーバーに裸のリポジトリを置きます(~/repos/mysite.git-パブリックフォルダーではありません)
  3. コードローカルと:git push me@myserver:repos/mysite.git
  4. サーバー上:git pull ~/repos/mysite.git最新のものを取得するには

これは正しいですか?それは論理的ですか?それはあなたがすることですか?

4

3 に答える 3

4

何をするにしても、git hooksを使用して少し自動化することをお勧めします。フックは、特定のイベントで git が実行する一連のスクリプトです。ここで関連するのは、更新後のフック (サーバーのリポジトリ内) です。通常のレポでは、フックは に.git/hooksあるため、裸のレポでは、フックは にありますhooks。そのディレクトリには、おそらく現在、多くのサンプル フック スクリプト (*.sample最近のバージョンで名前が付けられています) が含まれています。と呼ばれるものを作成する必要があります。post-updateこれには、サーバーがプッシュされた後に実行するアクションが含まれます (たとえば、他のレポに cd してプルを実行します)。

ソリューションの詳細については...チェックアウトされたブランチにプッシュしないことで正しいことをしています。あなたがやっていることで唯一考えられる問題は、ファイルをチェックアウトするためだけに使用されるリポジトリの余分なコピーがサーバーに残ることです。このディスク容量の浪費が気に入らないと判断した場合は、次のようにするとうまくいくと確信しています。

git --work-tree=/path/to/checkout-dir --bare reset --hard

これは、指定されたパスを作業ディレクトリとして使用して適切な状態にリセットするように git に指示しますが、リポジトリは実際にはむき出しであることに注意してください。私は個人的にこの種のことをしたことはありませんが、私の小さなテストではうまくいくようです!

注:とにかくチェックアウトされたブランチにプッシュすることにした場合(サーバー上のリポジトリがファイルのコピーへのプッシュとチェックアウト以外に使用されない場合のみ)...これについて完全に確信している場合は、サーバーの gitconfig で receive.denyCurrentBranch を false に設定し、サーバーgit reset --hard上で実行して、作業ディレクトリを強制的にあるべき状態にすることができます。

于 2009-08-28T16:35:12.327 に答える