私はCENTRALの裸のリポジトリを持っています。そこには3つの開発者リポジトリが普通に引っ張ってプッシュしています。
私はCENTRALの裸のリポジトリから引き出す他の2つのリポジトリも持っています。1つはライブサーバー、もう1つはテスト/ステージサーバーです - それぞれがそれぞれのブランチから引っ張ってきます。
シナリオは次のとおりです。CENTRALリポジトリにpost-update
フックスクリプトがあり、テストリポジトリとライブリポジトリに自動的にアクセスし、それぞれに対してpullコマンドを実行します。これによりテストサーバーとライブサーバーの両方が更新されます。すべてのブランチで新しいコミットが行われているかどうかによって異なります。これはすべてうまくいきます。
問題はこれです。緊急時にはファイルが(ftpなどを介して)サーバー上で直接更新され、マージ/上書きの競合が発生するためCENTRAL更新後スクリプトが失敗することがあります。このシナリオを回避する方法はありません、そしてそれは避けられません。
ライブサイトとテストサイトからalwayspull/mergeにpullしたいのです。 Always.これらのリポジトリは開発用ではないためプルのみになります。
私のすべての調査では、pullalwaysにしてローカルファイルを強制的に上書きする良い解決策は見つかりません。これは可能ですか。もしそうなら、それは素晴らしい開発シナリオになるでしょう。
これを行うための理想的な方法は、pull
をまったく使用せず、代わりにfetch
とreset
を使用することです。
git fetch Origin master
git reset --hard FETCH_HEAD
git clean -df
(あなたがフォローしたいブランチにmaster
を変更すること。)
pull
は何らかの方法で変更をマージするように設計されていますが、reset
は単にローカルコピーを特定のコミットに一致させるように設計されています。
あなたはあなたのシステムの必要性に応じてclean
へのわずかに異なるオプションを考慮したいかもしれません。
あなたはこれを試すことができます:
git reset --hard HEAD
git pull
(from どうやって "git pull"でローカルファイルを上書きするのですか? )
もう1つのアイデアは、git全体を削除して新しいクローンを作成することです。
1つのコマンドでそれを実行する方法がわかりませんが、次のようにすることができます。
git reset --hard
git pull
あるいは
git stash
git pull
ブランチからコピーを取得し、Originからローカルファイルを強制的に上書きするには:
git reset --hard Origin/current_branch
現在の作業はすべて失われ、Originブランチと同じになります。
git reset --hard HEAD
git fetch --all
git reset --hard Origin/your_branch
あなたはすべてをきれいに拭くためにフックを変えることができます。
# Danger! Wipes local data!
# Remove all local changes to tracked files
git reset --hard HEAD
# Remove all untracked files and directories
git clean -dfx
git pull ...
前回のpull/clone以降、まだローカルの変更をコミットしていない場合は、次のようにします。
git checkout *
git pull
checkout
は最後のローカルコミットであなたのローカルな変更をクリアし、pull
はそれをリモートリポジトリに同期させます。