Git倉庫のコミット履歴で著者情報を変える方法


両方のワーク関連の個人的なプロジェクトに取り組んでいるときは、しばしば、あなたは対応するリポジトリにプッシュするためにGit資格情報の間を前後に交換する必要があります.そして、時々、あなたは忘れます.🤷‍♂️
このポストでは、あなたの倉庫の歴史のコミットのために著者名/電子メールを速く変えるいくつかの異なるオプションを提供します.そして、間違ったコミット著者(または誤った著者の詳細)を正しい情報で交換します.まず、我々はコミットを編集するための安全な方法のいくつかを通過し、最終的に、私は共有するcustom script それはあなたのために重いリフトを行います.

何を成し遂げようとしているのですか。


変更する方法の著者情報を変更するには、自分自身を見つける状況によって異なります.
  • あなたがコミットを行う前に、著者の情報を変更する必要がありますか?
  • コミットはローカルかリモートか?
  • どのように多くのコミットを変更する必要がありますか?我々はコミット(またはそれらのすべてさえ)の多くを変更することについて話していますか?
  • コミットを行う前に著者情報を変更


    コミットを行う前にアイデンティティを変更する必要がある場合は、情報を更新するには3つの方法があります.このセクションに記載されたメソッドのどれも前のコミットに影響しません.

    次のコミットのみの著者の詳細を変更する


    次のコミットだけの著者の電子メール/名前を変更する必要がある場合は、--author 指定した情報をコミットします.
    git commit --author="Marty McFly <[email protected]>" --message="Changing text on prom banner"
    

    現在のリポジトリの著者情報を変更する


    現在のリポジトリ内のすべての将来コミットに使用される著者情報を変更するには、git config ここでしか適用されない設定
    # Navigate to repository
    cd path/to/repository
    
    git config user.name "Marty McFly"
    git config user.email "[email protected]"
    

    著者名と電子メールをグローバルに変えてください


    あなたのコンピュータがグローバルレベルで使用する著者情報を更新するには--global フラグ:
    git config --global user.name "Marty McFly"
    git config --global user.email "[email protected]"
    

    以前のコミットの履歴の編集


    それで、すでに作られたコミットの著者情報を編集する必要がありますか?まず最初に、あなたのコミット履歴を編集する安全な(R)方法を行きましょう.

    最後のコミットを編集


    あなたが最後のコミットを編集する必要があるならば--amend 旗はあなたの友人です:
    git commit --amend --author="Marty McFly <[email protected]>"
    

    対話型Rebaseによる複数のコミットの編集


    コミット履歴を編集する最も簡単な(そして最も安全な)方法はgitの対話を使用することですrebase コマンド.
    まず最初に、あなたが編集したいものの前のコミットのハッシュを見つけ、Rebaseコマンドに渡します.
    # Passing the last "good" commit hash
    git rebase -i 9b4351e2
    
    それから、あなたがedit キーワード
    edit 9b4351e2 Changing text on prom banner
    edit 4d0f36c0 Setting flux capacitor to 1955
    pick f4b39b80 Adding plutonium
    
    Gitは、各コミットを通して、あなたが望むように編集することができます.
    Stopped at 9b4351e2... Changing text on prom banner
    You can amend the commit now, with
    
        git commit --amend
    
    Once you are satisfied with your changes, run
    
        git rebase --continue
    
    各コミットを実行し、それに応じて編集します.
    git commit --amend --author="Marty McFly <[email protected]>" --no-edit
    
    git rebase --continue
    

    Gitフィルタ分岐スクリプトを使用してすべての履歴を編集します


    私はgitを実装しましたfilter-branch コマンドは、インタラクティブなモードで使用することができるカスタムスクリプトに、またはオプションのフラグを介して受動的に.

    WARNING
    This action is destructive to your repository's history. If you're collaborating on a repository with others, it's considered bad practice to rewrite published history.

    You should only rewrite history if absolutely necessary.

    Running this script rewrites history for all repository collaborators. After completing these steps, any person with forks or clones must fetch the rewritten history and rebase any local changes into the rewritten history.


    指示


  • Download the script Gitthubから簡単にアクセス可能な場所に保存します.

    アダデヘブン / 変更git著者


    正しくない著者情報を解決するために、Gitリポジトリのコミット履歴を更新します。


  • スクリプトファイルのパーミッションを変更して実行します.
  • chmod +x changeauthor.sh
    
  • 誤ったコミット履歴を持つリポジトリに移動する
  • cd path/to/repo
    
    代わりに、どこからでも実行することができます --git-dir and --work-tree フラグ.
  • スクリプトを実行する
  • ../path/to/changeauthor.sh --old-email [email protected] --new-email [email protected] --name "Marty McFly" --remote origin
    
    実行を許可する権限を変更しない場合は、次のいずれかでスクリプトを呼び出すこともできます.
    bash ./changeauthor.sh [OPTIONS]...
    
    sh ./changeauthor.sh [OPTIONS]...
    
    スクリプトを実行しないoption flags , 必要な値を対話的にプロンプトを介してプロンプトが表示されます.その後、スクリプトはローカルリポジトリを更新し、指定されたリモートに変更をプッシュします.
    Gitフィルタの分岐を抑制したい場合は、次の行を追加します~/.bashrc コンピュータのファイル:
    export FILTER_BRANCH_SQUELCH_WARNING=1
    
    あなたがどこからでも呼び出すことができる関数としてスクリプトを設定するのを好むならば、以下の機能をあなたのものに加えてください~/.bashrc ファイル
    function changegitauthor() {
      # Update the path to point to the absolute path of the script on your computer
      bash /c/absolute/path/to/change-git-author/changeauthor.sh "$@"
    }
    
    スクリプトに直接(オプションとして)フラグを渡すか、対話モードでスクリプトを実行するには何も渡しません.利用可能なオプションのすべては以下のようになります.

    古いメール

  • 使用法:-o , --old-email
  • 例:[email protected]
  • あなたがコミット履歴に置換したい著者の古い/不適切な電子メールアドレス.

    新しいメール

  • 使用法:-e , --new-email
  • 例:[email protected]
  • 新しい/訂正された電子メールアドレスは、一致するコミットに置き換えますold-email アドレス.

    新しい名前

  • 使用法:-n , --new-name
  • 例:Marty McFly
  • 新しいコミット著者情報の新規/修正名.(引用符で名前を囲むようにしてください)

    リモート

  • 使用法:-r , --remote
  • デフォルトorigin
  • 例:github
  • 変更したいリモートのリポジトリの名前.

    フォース

  • 使用法:-f , --force
  • スクリプトが非対話的シェルで正常に実行されます(すべての必須フラグが設定されていると仮定します).
    値を--remote 使用時フラグ--force , デフォルトのリモートorigin ) が使用されます.

    git dir

  • 使用法:-d , --git-dir
  • 現在のディレクトリと異なる場合は、リポジトリ(“. git”ディレクトリ)へのパスを設定します.これは絶対パスやカレントワーキングディレクトリへの相対パスである.
    このオプションは--work-tree フラグ.

    作業木

  • 使用法:-w , --work-tree
  • 作業ツリーへのパスを設定します.これは、絶対パスまたは現在の作業ディレクトリに相対パスです.

    ヘルプ

  • 使用法:-h , -? , --help
  • ヘルプコンテンツを表示します.

    バージョン

  • 使用法:-v , -V , --version
  • バージョン情報を表示します.