3

リポジトリの git 履歴を git-filter-branch で書き換えて、すべてのファイルで "foo.bar" をすべて "bar.foo" に置き換えたいと考えています。

どうすればこれを達成できますか?

更新:
--tree-filter パラメーターで遊んでいて、指定されたファイル内の単語を次のように置き換えることができました。

git filter-branch -f --tree-filter '
    if [ -f testfile ]
    then
        sed -i s/foo.bar/bar.foo/g testfile
    fi ' -- --all

これは、私が望んでいたことを達成するのに最も近いようです。

4

1 に答える 1

2

ツリー フィルターは、フィルター処理されるすべてのツリーに対して、一度に 1 つのツリーで実行されます。

その効果に関しては、次のことを行ったかのように想像できます。

git checkout <rev>

作業ディレクトリに、指定されたリビジョンに関連付けられたツリーが含まれるようになります。(実際、すべてのリビジョンを一時ディレクトリにほとんどチェックアウトします。これが非常に遅い理由です-d。フラグも参照してください。) ツリー内のすべてのファイルに変更を加えたい場合は、次のようにします。

find . -type f -print | xargs sed -i '' -e 's/foo\.bar/bar.foo/g'

特別なこと--tree-filterは、必要なgit addand/or git rm(したがって-i '';-i .bakgit addすべての.bakファイル) を自動的に実行することです。

(タグがある場合は忘れずに使用--tag-name-filterし、注釈付きタグの署名の削除に注意してください。)

于 2013-11-11T12:51:52.893 に答える