3

リモートリポジトリからクローンを作成したローカルリポジトリがあります(すべて1台のマシン上にあります)。リモートリポジトリがローカルリポジトリから変更を選択したことを確認したかったので、を実行しましたgit push origin

作業ディレクトリをリモートリポジトリに変更しました。変更はログファイルに伝播されましたが(つまり、変更が表示されgit logました)、実際の作業ディレクトリには変更が表示されませんでした。私はしましたgit checkout HEADが、CWDはまだ変わりませんでした。git checkout --force HEADCWDが同期するのは、私が行うまではありませんでした。

リモートリポジトリがベアリポジトリではないため、これが発生しているのではないかと思います。したがって、2つの質問:

  1. リモートリポジトリを自動的に同期させる(つまり、ローカルの変更を破棄する)方法はありgit pushますか?
  2. --force同期させるために使用する必要があるのはなぜですか?それを同期するプロセスはどうあるべきですか?
4

1 に答える 1

2

(ベア以外の)リポジトリへのプッシュが成功した場合、それは次の理由によるものです。

  • リモートリポジトリ(非ベアリモートリポジトリ)でチェックアウトされていないブランチをプッシュしたか
  • またはreceive.denyCurrentBranchに設定さfalseignoregit config

後者の場合、現在のローカル変更はそのプッシュによって消去されません。
のみgit checkout --forceが、作業ディレクトリをで参照される実際のインデックスコンテンツにリセットしHEADます。

2つの非ベアレポジトリ間の同期を確保する通常の方法は、実際のリモートレポジトリ(非ベアレポジトリ)に移動し、更新されたレポジトリからプルする受信後フックを使用して、中間のベアレポジトリ(プッシュ先)を追加することです。裸のリポジトリ。
通常の例:Gitを使用してWebサイトを管理します。これは次の場所で使用します。

引っ張っているときは、必ず設定を解除してください。 「gitフックからの呼び出し」GIT_DIRを参照してください。git pullpost-update

于 2012-07-21T15:03:37.057 に答える