2

既存のSVNリポジトリにインポートしたい約30のリビジョンを持つgitリポジトリがあります。残念ながら、SVNリポジトリには、コミットメッセージ内の特定の情報、特定のファイルタイプ内の特定のSVNキーワードなどを必要とする、多数の事前コミットフックがあります。これらはどれも、私がチェックインしているものとは実際には関係がありません。とにかく、既存の改訂履歴を保持するほど重要ではありません。

完璧な世界では、私はおそらく次のようなことをすることができます:

  1. 最初のgitリビジョン(および新しいファイルを導入するその他のリビジョン)をハイジャックして、必要なSVNキーワードを含め、対応するsvn:keywordsプロパティを設定します。
  2. 30個のgitcommitメッセージをすべて一括編集して、必要なcommit-message文字列を先頭に追加します

やや完璧ではない世界では、git-svnにskip-pre-commit-checksを追加することができます(?-これまで使用したことがありません)。そうすれば、少なくともすべての改訂履歴がそこにあります。 。

考え?


追加するために更新されました: skip-pre-commit-checksは実際には問題ではありません。特定のプロジェクトでの特定のハッキングに惑わされました。

4

1 に答える 1

5

いくつかのオプションがあります。

コミットメッセージの一括書き換え

git filter branchを使用して、コミットメッセージを書き直すことができます。

たとえば、最後の10個のコミット(いずれもマージではない)にAcked-by行を追加する必要がある場合は、次のコマンドを使用します。

git filter-branch --msg-filter '
    cat &&
    echo "Acked-by: Bugs Bunny <bunny@bugzilla.org>"
' HEAD~10..HEAD

30のコミットメッセージの手動編集

編集モードを選択することで、git rebase Interactiveを使用して、コミットメッセージを書き換えることができます

git rebase -i HEAD~30

edit f7f3f6d changed my name a bit
edit 310154e updated README formatting and added blame
edit a5f4a0d added cat-file
...

それで

git commit -v --amend
<editor launched, edit commit message>
git rebase --continue
git commit -v --amend
<editor launched, edit commit message>
git rebase --continue
git commit -v --amend
<editor launched, edit commit message>
git rebase --continue
....

すべてを1つのコミットに押しつぶします

git rebaseを使用して、エバーシングを1つのコミットに押しつぶし、ワークロードを制限することもできます

git rebase -i HEAD~30

pick f7f3f6d changed my name a bit
squash 310154e updated README formatting and added blame
squash a5f4a0d added cat-file
...

<editor launched, edit the combined commit message>

プロアクティブな自動化

これを定期的に行う必要がある場合は、prepare commit mesgフックを使用して、コミットメッセージの形式に一貫性を追加できます。

gitとは異なり、svnのpre-commitフックをスキップすることはできないことに注意してください(少なくとも組み込みのメカニズムでは)。そのためgit commit -va --no-verify、次に実行するときに、次のようなことを試みても効果はありませgit svn dcommitん。すべて失敗します。同じです(もちろん失敗するものがある場合)。

于 2012-05-30T22:40:50.713 に答える