52

Subversion から既に複製したリポジトリがあります。私はこのリポジトリで Git 形式でいくつかの作業を行ってきましたが、再度クローンを作成してその構造を失うのは嫌です。

ただし、最初にリポジトリを複製したときに、svn.authorsプロパティ (または意味的に類似したオプション) を正しく指定できませんでした。

リポジトリが完全に Git 化されたので、SVN 作成者のマッピングを指定する方法はありますか?

できれば、生の SVN ユーザー名ではなく、Git の作成者を表すように古いコミットの作成者をすべて修正したいと思います。

4

3 に答える 3

57

クリーンアップする必要があるものを確認することから始めます。

git shortlog -s

これらの名前のそれぞれについて、次のようなスクリプトでエントリを作成します (すべての作成者とコミッターを同じにする必要があると仮定します)。

#!/bin/sh

git filter-branch --env-filter '

n=$GIT_AUTHOR_NAME
m=$GIT_AUTHOR_EMAIL

case ${GIT_AUTHOR_NAME} in
        user1) n="User One" ; m="user1@example.com" ;;
        "User Two") n="User Two" ; m="user2@example.com" ;;
esac

export GIT_AUTHOR_NAME="$n"
export GIT_AUTHOR_EMAIL="$m"
export GIT_COMMITTER_NAME="$n"
export GIT_COMMITTER_EMAIL="$m"
'

これは基本的に、最近大規模な書き直しに使用したスクリプトであり、あなたが説明したとおりです(ただし、多数の作成者がいたことを除いて)。

edit π を使用すると、スクリプトの引用の問題が指摘されました。ありがとう!

于 2008-12-25T01:52:40.467 に答える
11

git filter-branch履歴の大きなチャンクを書き換えるために使用できます。

この場合、おそらく次のようにします (まったくテストされていません)。

git filter-branch --env-filter '
    GIT_AUTHOR_NAME=`echo "${GIT_AUTHOR_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"`
    GIT_COMMITTER_NAME=`echo "${GIT_COMMITTER_NAME}" | sed -e "s/svnname1/Right Name/; s/svnname2/Correct Name/"`
    GIT_AUTHOR_EMAIL=`echo "${GIT_AUTHOR_EMAIL}" | sed -e "s/svnname1/m@i.l/; s/svnname2/correct.name@e.mail/"`
    GIT_COMMITTER_EMAIL=`echo "${GIT_COMMITTER_EMAIL}" | sed -e "s/svnname1/m@i.l/; s/svnname2/correct.name@e.mail/"`
'

いつものように、次のことが当てはまります: 歴史を書き換えるには、陰謀が必要です。

于 2008-12-24T23:49:45.550 に答える
3

git-filter-branchおそらく、特に--commit-filterオプションを調べたいと思うでしょう。このコマンドは、リポジトリ履歴全体を書き換えて、変更したいものを変更できる強力なチェーンソーです。

これを行う場合、すべてのコミットの SHA1 ハッシュが変更されている可能性があるため、更新されたリポジトリから新しいクローンをプルする必要があることに注意してください。

于 2008-12-24T23:36:52.893 に答える