2017-04-26 17 views
1

私はGitリポジトリが、のロットからWordPressのコアファイルを削除し、それがローカル壊れないように、ファイルを保存したいでも、他のマシン上のプル後--cachedGitは、GitのRMでファイルを維持する方法は

git rm --cached -r wp-includes/ wp-admin/ ......

は、それが生産を破壊しないように、物理的にファイルをを削除せずにをコミットし、質問が本番サーバー上で、どのように、問題を解決git pull

どのような解決策ですか?

答えて

1

最初に、提案されたソリューションに対処する:両方の場所で同じ変更をコミットすると、自分自身が不要なトラブルを引き起こしてしまいます(実際には、現場でのコミットと現場でのコミットは同じです。 。コミットはではなくで、の場合はが異なる場合、gitの観点から(SHA1の値が異なる)同じになります。完全にすべてを実行しようとしても、タイムスタンプは異なります。私は前にタイムスタンプを忘れて自分自身を台無しにしてしまったので、これで私を信頼してください。同じ変更を加えた2つの異なるコミットがあれば、すべての同期を取り戻すのは面倒な作業ですが、偶然にも偶然にもファイルを削除してしまいます。

だからではなく、

私はあなたが.gitignoreに追加したファイルを削除した場合と同じにコミットすることを想定しています。 (もしそうでなければ...良いことだと思いますが)あなたがしなかったとしても、私が提案しようとしていることはコミットに他の削除がなければ十分に簡単に働くでしょう。

pullを実行すると、コミット(削除を含む)が適用されますので、注意してください。それは悪いです。しかし、resetを使ってそれらの変更を "ステップオーバー"することができます。最も一般的な手順を説明します。あなたが生産中であるとします:

X --- X <--(master) 

originの後ろです。今の代わりにpullのないAは(すなわち、新たにフェッチされたが、コミット最初の削除を持っている)が存在しない場合は、このステップをスキップすることができますあなたの

X --- X <--(master) 
     \ 
     A --- B --- C <--(origin/master) 
      ^
      deletes are here 

を与える

git fetch 

を行います。しかし、そうでない場合:

git reset --hard A 

とは、今私たちはgitのはBが私たちの仕事の木はそのまま残し

git reset --mixed B 

を適用することを考えてみましょうする必要が

X --- X --- A <--(master) 
      \ 
       B --- C <--(origin/master) 
      ^
      deletes are here 

次を持っています。つまり、git statusは、(a)その変更が削除であり、(b)対応するエントリが入れられていない限り、Bからの各変更の逆数をステージングされない変更として表示することを意味します。gitignore); B変更ファイルを削除以外のを持っていた場合、2番目のそれによりますが、私たちの絵は今

X --- X --- A --- B <--(master) 
        \ 
        C <--(origin/master) 

のように見える、あなたはあなたの仕事の木からそれらの変更の「元に戻す」を削除する必要があります。

git checkout -- . 

が( - この演習の点であることをあなたが削除を適用したくないので、良いです)ファイルの削除以外のものを適用する必要があります。 他のの削除がある場合は、それらを手動で再適用する必要があります。 git statusの出力が進みます(特に.gitignoreを更新した場合、git statusがクリーンな作業ツリーを報告したときに完了していることがわかります)。

ここからコミットC(すなわち削除した後にコミットが行われている)があるので、もし私たちは、正常に戻ったアプローチに行く:

git pull 

、最終的に我々は

X --- X --- A --- B --- C <--(master)(origin/master) 

を持っているが、削除されたファイルのワークツリーのコピーが影響を受けていない。

+0

私はあなたのdetailled答えに感銘を受けた、ありがとう、私は1つのリポジトリでこれを試してみるつもりですが、私は50以上のリポジトリでこの操作をしているので、私はSHA1コミットしますが、「最後にコミットする」ので、この操作を1つずつ実行するのではなく、このプロセスを自動化できますか?ご意見ありがとうございます ! –

+0

私はgit ls-remote で自分のやり方を管理します。ありがとうございます、あなたのソリューションは魅力的です:-) –

+1

SHAの代わりに任意のコミット指定子を使用できます。だからコミットにタグ付けしてタグを配布したり、コミットが 'N'でコミットしていることを知っていればHEAD〜* N *を使うことができます(最新のコミットであればHEAD ^)。多くのリポジトリインスタンスを自動化するだけで、これを1回だけ実行すれば、SHA1の値はすべてのインスタンスで同じになるので、一度キャプチャしてスクリプトに入れても問題ありません。 –

関連する問題