web-dev-qa-db-ja.com

Gitの作成者とコミッターの違いは?

私は次のようなコミットをしようとしています

git commit --author="John Doe <[email protected]>" -m "<the usual commit message>"

ここで、John Doeは、名前をコミットしたいユーザーです。

git logで大丈夫です。ただし、gitkを実行すると、作成者名は正しいが、コミッター名はグローバルgit config設定から選択されます(したがって、私の名前/メールに設定されます)。

ご質問

  1. 2つの違い(コミッターと著者)は何ですか?

  2. 他のユーザーにもコミッターを設定する必要がありますか?

  3. はいの場合、どのように?

189
mu 無

元のポスターは尋ねます:

2つのコミッターと著者の違いは何ですか?

作成者は、元々コードを書いた人です。一方、コミッターは、元の著者に代わってコードをコミットした人であると想定されます。 Gitでは履歴を書き換えたり、他の人に代わってパッチを適用したりできるため、これはGitで重要です。 FREEonlinePro Gitbook =このように説明します:

authorcommitterの違いは何かと疑問に思われるかもしれません。 authorは元々パッチを書いた人で、committerは最後にパッチを適用した人です。そのため、パッチをプロジェクトに送信し、コアメンバーの1人がパッチを適用すると、作成者およびコミッターとしてのあなたの両方が信用を得ます。

元のポスターは尋ねます:

他のユーザーにもコミッターを設定する必要がありますか?

いいえ、正直に言うと、著者とコミッターが実際に同じ人物でない限り、著者にコミッターを設定するべきではありません。

177
user456814

メーリングリスト+ git format-patch + git applyは作成者を生成できます!=コミッター

パッチがあるLinuxカーネルのようなプロジェクトでは:

作成者とコミッターが異なる単一の新しいコミットを生成します。

  • 作者はパッチを書いた人です
  • コミッターは誰がプロジェクトのメンテナーであり、誰がパッチをマージしたか

たとえば、このランダムに選択されたパッチと対応するコミットを参照してください。

GitHubやGitLabなどのGit Webインターフェースは、作成者を生成する場合と生成しない場合があります!=コミッター

Git(Hub | Lab)は同じマシン上でアップストリームリポジトリとforkリポジトリの両方を保持しているため、次のいずれかを含め、ローカルで実行できることはすべて自動的に実行できます。

  • マージコミットを作成します。

    Author!=コミッターを生成しません。

    SHAまたは新しいコミットをそのまま保持し、新しいコミットを作成します。

    * Merge commit (committer == author == project maintainer)
    |\
    | * Feature commit (committer == author == contributor)
    |/
    * Old master (random committer and author)
    

    歴史的に、これはGitHubで利用可能な最初の方法でした。

    ローカルでは、これはgit merge --no-ffで行われます。

    これにより、プルリクエストごとに2つのコミットが生成され、git履歴にフォークが保持されます。

  • masterの上にリベースします

    GitHubは、コミットをハッキングして、マージボタンを押した人をコミッター==に設定します。これは必須ではなく、デフォルトではgit rebaseによってローカルで実行されることもありませんが、プロジェクトのメンテナーに説明責任を与えます。

    Gitツリーは次のようになります。

    * Feature commit (committer == maintainer, author == contributor)
    |
    * Old master (random committer and author)    
    

    これは、git apply電子メールパッチとまったく同じです。

現在GitHubで:

  • マージボタンのドロップダウンを使用してマージするときに方法を選択します
  • 所有者はレポ設定でメソッドを有効または無効にすることができます

https://help.github.com/articles/about-merge-methods-on-github/

新しいコミットのコミッターを設定する方法は?

環境変数を使用してコミッターをオーバーライドすることを見つけることができました。

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'

特定のコミットのコミッターとコミット日を取得する方法は?

git logではデフォルトで著者データのみが表示されます。

コミッターの日付を表示するには、次のいずれかを実行できます。

  • 特にそのためにログをフォーマットします。

    git log --pretty='%cn %cd' -n1 HEAD
    

    ここで、cnおよびcdCommitter NameおよびCommitter Dateを表します

  • 定義済みのfuller形式を使用します。

    git log --format=fuller
    

    参照: 「git log」を設定して「commit date」を表示する方法

  • 低レベルに移動し、コミットデータ全体を表示します。

    git cat-file -p HEAD
    

新しいコミットのコミッターの日付を設定する方法は?

git commit --dateは作成者の日付のみを設定します。コミッターの日付については、環境変数で見つけることができました。

GIT_COMMITTER_DATE='2000-01-01T00:00:00+0000' git commit --date='2000-01-01T00:00:00+0000'

参照: Gitの作成者とコミッターの違いは何ですか?

Gitはどのように著者とコミッターを内部に保存しますか?

参照: git commitオブジェクトのファイル形式は?

基本的に、コミットはテキストファイルであり、2行に区切られたフィールドが含まれています。

author {author_name} <{author_email}> {author_date_seconds} {author_date_timezone}
committer {committer_name} <{committer_email}> {committer_date_seconds} {committer_date_timezone}

これにより、両方がコミットオブジェクト内の2つの完全に独立したデータエントリであることが明確になります。

@Ciro Santilli新疆改造中心六四事件法轮功 使用することを提案

GIT_COMMITTER_NAME='a' GIT_COMMITTER_EMAIL='a' git commit --author 'a <a>'

名前とメールを繰り返すことを避けるために、それらを再利用できます

GIT_COMMITTER_NAME='a'; GIT_COMMITTER_EMAIL='a'; git commit --author "$GIT_COMMITTER_NAME <$GIT_COMMITTER_EMAIL>"

最初に変数を個別のコマンドで設定し、次にgit commit呼び出しに使用します(二重括弧に注意してください)。

0
serv-inc