1. ホーム
  2. git

[解決済み] Git リポジトリからファイルを削除せずにインデックスからファイルを削除する方法

2022-04-23 22:47:13

質問

を使用する場合

git rm --cached myfile

は、ローカルのファイルシステムから削除しないのが目的です。しかし、このコマンドを使う前に、すでにファイルをバージョン管理してコミットし、中央のリポジトリにプッシュし、さらに別のリポジトリにプルしていた場合、そのシステムからファイルを削除してしまいます。

どのファイルシステムからもファイルを削除することなく、バージョン管理からファイルを削除するだけの方法はないでしょうか?

編集:明確化されましたね。

解決方法は?

Git のコミットには、「このファイルの追跡を停止するが、削除はしない」というような意図を記録することはできないと思うのですが。

そのような意図を実現するには、ファイルを削除したコミットをマージする(あるいはリベースする)リポジトリに、Gitの外側から介入する必要があります。


コピーの保存、削除の適用、リストア

おそらく最も簡単な方法は、ファイルのコピーを保存し、削除を実行し、ファイルを復元するように下流のユーザーに伝えることです。 もし、リベース経由でプルし、ファイルへの変更を「持ち運んで」いる場合、コンフリクトが発生します。このようなコンフリクトを解決するには git rm foo.conf && git rebase --continue (競合するコミットが削除されたファイル以外の変更を持っている場合)または git rebase --skip (競合するコミットが削除されたファイルに対してのみ変更を加えた場合)。

ファイルを削除したコミットをプルした後、未追跡ファイルとしてリストアする

削除コミットを既に引き出してしまった場合でも、以前のバージョンのファイルを復元するには ギットショー :

git show @{1}:foo.conf >foo.conf

または ギットチェックアウト (William Pursellのコメントによる; ただし、インデックスから再除去することを忘れないでください!)。

git checkout @{1} -- foo.conf && git rm --cached foo.conf

あなたの削除をプルした後に他のアクションを実行した場合 (あるいはデタッチド HEAD にリベースしてプルした場合)、次のようなものが必要になるかもしれません。 @{1} . 彼らは git log -g を使えば、あなたの削除を撤回する直前のコミットを見つけることができます。


コメントで、「追跡を解除したいが、保持したい」ファイルは、ソフトウェアを (リポジトリから直接) 実行するために必要な何らかの設定ファイルであると述べておられますね。

ファイルを「デフォルト」として保持し、手動/自動でアクティベートする

設定ファイルの内容をリポジトリで管理し続けることが全く受け入れられないわけではないのであれば、追跡したファイルの名前を(例えば) foo.conf から foo.conf.default を指示し、ユーザーには cp foo.conf.default foo.conf を適用した後、リネームコミットを行います。 あるいは、ユーザーがすでにリポジトリの既存の部分(例えば、リポジトリ内のコンテンツによって設定されたスクリプトやその他のプログラム)を使用している場合(例. Makefile など))を使ってソフトウェアを起動/デプロイしている場合、起動/デプロイ処理にデフォルト化メカニズムを組み込むことができます。

test -f foo.conf || test -f foo.conf.default &&
    cp foo.conf.default foo.conf

このようなデフォルトの仕組みがあれば、ユーザーがコミットした際に foo.conf から foo.conf.default を使えば、余分な作業をすることなく また、将来的にインストールやリポジトリを追加する場合にも、設定ファイルを手動でコピーする手間が省けます。

歴史を書き換えるには、とにかく手作業が必要なのですが...。

もし、リポジトリのコンテンツを維持することが受け入れられないのであれば、次のような方法で履歴から完全に削除したいことでしょう。 git filter-branch --index-filter … . これは履歴の書き換えに相当し、ブランチやリポジトリごとに手作業が必要になります(「上流のリベースから復旧する」セクションを参照)。 git rebase マンページ ). 設定ファイルに必要な特別な処理は、書き換えから回復する際に行わなければならない、もうひとつのステップに過ぎません。

  1. 設定ファイルのコピーを保存してください。
  2. 書き換えから回復する。
  3. 設定ファイルを復元する。

無視することで再発を防ぐ

どのような方法を使うにせよ、設定ファイル名を .gitignore ファイルをリポジトリに保存することで、誰も不用意に git add foo.conf を再び使用することができます(可能ですが、そのためには -f / --force ). 複数の設定ファイルがある場合、それらをすべて1つのディレクトリに「移動」して、全体を無視することを考えるかもしれません(「移動」とは、プログラムが設定ファイルを見つけることを期待する場所を変更し、ユーザー(または起動/デプロイ機構)に新しい場所にファイルをコピー/移動してもらうことを意味します。 git mv を、無視することになるディレクトリに移動させます)。