[解決済み] Git リポジトリからファイルを削除せずにインデックスからファイルを削除する方法
質問
を使用する場合
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
マンページ
).
設定ファイルに必要な特別な処理は、書き換えから回復する際に行わなければならない、もうひとつのステップに過ぎません。
- 設定ファイルのコピーを保存してください。
- 書き換えから回復する。
- 設定ファイルを復元する。
無視することで再発を防ぐ
どのような方法を使うにせよ、設定ファイル名を
.gitignore
ファイルをリポジトリに保存することで、誰も不用意に
git add foo.conf
を再び使用することができます(可能ですが、そのためには
-f
/
--force
).
複数の設定ファイルがある場合、それらをすべて1つのディレクトリに「移動」して、全体を無視することを考えるかもしれません(「移動」とは、プログラムが設定ファイルを見つけることを期待する場所を変更し、ユーザー(または起動/デプロイ機構)に新しい場所にファイルをコピー/移動してもらうことを意味します。
git mv
を、無視することになるディレクトリに移動させます)。
関連
-
[解決済み] Git で直近のローカルコミットを取り消すには?
-
[解決済み] Git リポジトリを以前のコミットに戻すにはどうすればよいですか?
-
[解決済み] 現在のGit作業ツリーからローカル(未追跡)ファイルを削除する方法
-
[解決済み] Git が追跡したファイルを .gitignore に登録したまま「忘れる」ようにするにはどうしたらいいですか?
-
[解決済み] Git リポジトリでのマージの衝突を解決するには?
-
[解決済み] リモート Git リポジトリの URI (URL) を変更するには?
-
[解決済み] ローカルファイルシステムからファイルを削除せずに、Git リポジトリからファイルを削除する
-
[解決済み] Git リポジトリからファイルを削除するにはどうすればよいですか?
-
[解決済み】"git pull" でローカルファイルを強制的に上書きするには?
-
[解決済み】Git リポジトリに空のディレクトリを追加するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Gitのエラー。リモートリポジトリへの接続時に「Host Key Verification Failed」。
-
[解決済み] あなたのブランチは 'origin/master' より 3 コミット進んでいます。
-
git revert 複数コミット
-
[解決済み】gpgがデータの署名に失敗した fatal: failed to write commit object [Git 2.10.0].
-
[解決済み] GitHubに空のブランチを作成する
-
[解決済み] "would clobber existing tag "を取り除くには?
-
[解決済み] TortoiseGitで「git did not exit cleanly (exit code 128)」というエラーを解決するには?[クローズド]
-
[解決済み] git ls-remote と git ls-remote origin の違い。
-
[解決済み] git rebase: "error: cannot stat 'file': パーミッションが拒否されました"
-
[解決済み] ディスクからファイルを削除せずに git rm する方法を教えてください。重複