ここでは、git filter-branchを使用してインデックスからファイルを削除します。 最初の分岐点までのコミットにはしか使用しないことが重要です。そうでない場合、元の親にブランチをマージすることができないかもしれませんし、誤って親ブランチ内の同じ名前のファイルを削除する可能性もあります。
親ブランチの名前が不明であると仮定すると、問題が発生します。ただし、これはgit branch --contains
を使用して解決できます。
filename=fileA
# git filter-branch will delete the local copy also, see
# http://stackoverflow.com/q/33333200/2173773. So take a backup first.
cp "$filename" "$filename".bak
readarray -t revlist < <(git rev-list HEAD)
sha1=""
for sha in "${revlist[@]}" ; do
readarray -t branches < <(git branch --contains "$sha")
# if there are more than a single branch that contains this commit
# we have reached the branch point
if ((${#branches[@]} > 1)) ; then
sha1="$sha"
break
fi
done
git filter-branch -f --index-filter \
"git rm --cached --ignore-unmatch $filename" "$sha1"..HEAD
# restore backup file
mv "$filename".bak "$filename"