48

もともとSVNからインポートされた、数千のコミットを含むかなり大きなGitリポジトリがあります。リポジトリを公開する前に、新しいリポジトリで意味をなさない数百のコミット メッセージをクリーンアップし、追加された git-svn 情報テキストをすべて削除したいと考えています。

「git rebase -i」を使用してから「git commit --amend」を使用して個々のコミット メッセージを編集できることはわかっていますが、何百ものメッセージを編集する必要があるため、それは非常に面倒です。

これらのコミット メッセージをすべて編集するより速い方法はありますか? 理想的には、すべてのコミット メッセージを 1 つのファイルにリストし、それらすべてを 1 か所で編集できるようにします。

ありがとう!

4

7 に答える 7

45

それは古い質問ですが、 についての言及がないのでgit filter-branch、2 セント追加します。

私は最近、コミットメッセージのテキストを大量に置き換え、残りのコミットメッセージを変更せずにテキストのブロックを別のブロックに置き換える必要がありました。たとえば、Refs: #xxxxxをRefs : #22917に置き換える必要がありました。

私はgit filter-branchこのように使用しました

git filter-branch --msg-filter 'sed "s/Refs: #xxxxx/Refs: #22917/g"' master..my_branch
  • --msg-filterコミット メッセージのみを編集するオプションを使用しましたが、他のフィルターを使用してファイルを変更したり、完全なコミット情報を編集したりできます。
  • filter-branchマスター ( ) にないコミットにのみ適用することで制限しましたが、コミットmaster..my_branchの範囲を省略することでブランチ全体に適用できます。

ドキュメントで提案されているように、ブランチのコピーでこれを試してください。それが役立つことを願っています。


回答に使用したソース

于 2016-06-21T10:04:45.853 に答える
17

これは、次のように簡単に実行できます。

  • 最初のインポートを実行します。
  • すべてのコミットをテキストにエクスポートします。

    git format-patch -10000
    

    数は合計コミット数よりも大きくする必要があります。という名前のファイルがたくさん作成されますNNNNN-commit-description.patch

  • スクリプトを使用してこれらのファイルを編集します。(コミットメッセージのあるトップを除いて、それらの中には何も触れないでください)。
  • 編集したファイルを空の git リポジトリまたはブランチにコピーまたは移動します。
  • 編集したすべてのコミットをインポートします。

    git am *.patch
    

これは単一のブランチでのみ機能しますが、非常にうまく機能します。

于 2013-01-15T07:03:03.763 に答える
11

git-filter-repo https://github.com/newren/git-filter-repoが推奨されるようになりました。私はそれを次のように使用しました:

PS C:\repository> git filter-repo --commit-callback '
>> msg = commit.message.decode(\"utf-8\")
>> newmsg = msg.replace(\"old string\", \"new string\")
>> commit.message = newmsg.encode(\"utf-8\")
>> ' --force
New history written in 328.30 seconds; now repacking/cleaning...
Repacking your repo and cleaning out old unneeded objects
HEAD is now at 087f91945a blah blah
Enumerating objects: 346091, done.
Counting objects: 100% (346091/346091), done.
Delta compression using up to 8 threads
Compressing objects: 100% (82068/82068), done.
Writing objects: 100% (346091/346091), done.
Total 346091 (delta 259364), reused 346030 (delta 259303), pack-reused 0
Completely finished after 443.37 seconds.
PS C:\repository>

おそらく、powershell の余分なものをコピーしたくないので、ここにコマンドを示します。

git filter-repo --commit-callback '
msg = commit.message.decode(\"utf-8\")
newmsg = msg.replace(\"old string\", \"new string\")
commit.message = newmsg.encode(\"utf-8\")
' --force

すべてのブランチをヒットしたい場合は、使用しないでください--refs HEAD。使用したくない場合は--force、クリーンで実行できますgit clone --no-checkout。これで始めました:https://blog.kawzeg.com/2019/12/19/git-filter-repo.html

于 2020-06-18T20:12:22.993 に答える
4

(または単に)を使用git rebase -iして置き換えることができます。その後、コミットごとに git リベースが停止し、メッセージを編集する機会が与えられます。pickrewordr

唯一の欠点は、一度にすべてのメッセージが表示されないことと、エラーを見つけたときに戻ることができないことです。

于 2016-09-15T09:23:39.513 に答える
3

これを行うための優れた簡単な方法はgit filter-branch --msg-filter ""、python スクリプトを使用することです。

Python スクリプトは次のようになります。

import os
import sys
import re

pattern = re.compile("(?i)Issue-\d{1,4}")


commit_id = os.environ["GIT_COMMIT"]
message   = sys.stdin.read()

if len(message) > 0:

    if pattern.search(message):
        message = pattern_conn1.sub("Issue",message)

print message

コマンド ライン呼び出しは次のとおりです。git filter-branch -f --msg-filter "python /path/to/git-script.py"

于 2016-10-04T17:19:41.703 に答える
0

別の方法として、リポジトリ全体のインポートをスキップすることを検討してください。履歴の重要なポイントをチェックアウトし、クリーンアップしてコミットするだけです。

于 2013-01-15T07:47:26.070 に答える