2016-12-18 4 views
0

リポジトリをクローンした後、新しいブランチを作成し、このブランチに対していくつかのコミットを行いました任意のリモコン)。これらのコミットの一部では、ファイルfileAを間違えて導入(コミット)しました。さて、履歴からそのファイルを削除するにはどうすればよいですか?ローカルファイルシステムからファイルを削除するにはどうすればいいですか?また、(プロセスを完全に自動化するために)親ブランチの名前がわからないと仮定します。すべてのコミットから最初のブランチポイントまでファイルを削除しますが、ローカルファイルシステムからは削除しません

答えて

0

ここでは、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" 
関連する問題