質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

Q&A

解決済

1回答

1543閲覧

git filter-branch --index-filter 'git rm --cached ... とcachedオプションを付けているのにワーキングツリーからも削除されてしまう理由は?

domidomi

総合スコア34

Git

Gitはオープンソースの分散バージョン管理システム(DVCS)です。

GitHub

GitHubは、Gitバージョン管理システムを利用したソフトウェア開発向けの共有ウェブサービスです。GitHub商用プランおよびオープンソースプロジェクト向けの無料アカウントを提供しています。

0グッド

0クリップ

投稿2019/12/15 06:12

適当なディレクトリを作り以下を走らせて複数のコミットをつくりました。

bash

1git init 2touch readme.md 3echo "hoge" >> readme.md 4git add -A 5git commit -m "init" 6 7mkdir ignore_wasure 8touch ignore_wasure/file1 9touch ignore_wasure/file2 10git add -A && git commit -m"ignore_wasureを生成" 11touch file3 12git add -A && git commit -m"コミット" 13echo "hogehogehoge" >> ignore_wasure/file2 14git add -A && git commit -m"ignore_wasure内を編集" 15

その後、ignore_wasure/file2だけをインデックスから外すべく以下を実行しました。

bash

1git filter-branch --force --index-filter 'git rm --cached -rf --ignore-unmatch ignore_wasure/file2' --prune-empty -- --all

するとindex-filterにて--cachedを指定しているにも関わらず処理完了後にはワーキングツリーからignore_wasure/file2が消滅してしまっていました。

この原因がなぜだかわかる方がいらっしゃったらご教示願いたいです。

(etc 目指していたのは、全てのコミットからignore_wasure/file2のインデックスが外されており、ワーキングツリーにはignore_wasure/file2が残っているという状態でした。)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

こんにちは。
https://teratail.com/questions/228663 にて回答依頼のためここに書き残します。

filter-branch はまともに使ったことがないコマンドなので実際にどのような処理が行われているのかは理解していませんが、--index-filter の場合はインデックスツリー上で改変操作を行った後、最後に改変の結果をワーキングディレクトリに反映しているように見えます。
インデックスツリー上の操作において git rm --cached は単なる rm と区別がつかないため、インデックス上で削除したファイルは最終的にワーキングからも削除される動作になっている気がします。

コマンドは変えずに、 --index-filter--tree-filter に置き換えるだけで目的の結果が得られるのではないかと思います。

また、どうせ filter-branch をかけるのであれば、同時に .gitignore の内容も編集し、「最初から当該ファイルは ignore されていた」状態にしてしまうのも良いかと思います。

sh

1'git restore -s <最終形の.gitignoreを含むコミットのid> -WS .gitignore && git rm --cached -rf --ignore-unmatch ignore_wasure/file2'

試す前にリポジトリのバックアップは忘れずにお願いします。


ところで、filter-branch でリポジトリから特定のファイルを削除するということは、「当該ファイルをバージョン管理の対象外にする」という意味であるため、ファイルを先にリポジトリの「外」にバックアップを取り、処理後に手でポン置きするだけでも意図した形に収まると思うのですが。
Git によるファイル操作は、管理されたファイルに対しては強い信頼性がありますが、管理されないファイルには全く関知しません。

投稿2019/12/25 01:43

tamoto

総合スコア4103

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問