Git의 저자와 커미터의 차이점은 무엇입니까?


236

나는 커밋하려고합니다.

git commit --author="John Doe <john@doe.com>" -m "<the usual commit message>"

여기서 John Doe는 커밋하려는 이름의 사용자입니다.

에 모두 나타납니다 git log. 그러나 나는이 작업을 수행 할 때 gitk, 저자의 이름은 정확하지만, 커미터 이름은 내 글로벌 자식 설정 설정에서 선택됩니다 (따라서 내 이름 / 이메일로 설정).

질문

  1. 이 두 가지 (커미터와 저자)의 차이점은 무엇입니까?

  2. 커미터를 다른 사용자에게도 설정해야합니까?

  3. 그렇다면 어떻게?


4
jasonnoble.org/2009/04/github-set-authorcommitter.html 여기에 간단한 설명이 있습니다.
René Höhle


Git 커미터는 .gitconfig 파일에 있습니다. --author가 .gitconfig 이름과 동일하면 커밋 메시지에 작성자 만 표시됩니다. 그들이 다르면 둘 다 얻습니다.
poGUIst

답변:


215

원본 포스터는 다음과 같이 묻습니다.

이 두 가지 (Committer와 Author)의 차이점은 무엇입니까?

저자는 원래 코드를 작성한 사람입니다. 반면 커미터는 원래 작성자를 대신하여 코드를 커밋 한 사람으로 간주됩니다. Git을 사용하면 히스토리를 다시 쓰거나 다른 사람 대신 패치를 적용 할 수 있으므로 Git에서 중요합니다. 무료 온라인 프로 힘내 책은 이런 식으로 설명 :

저자커미터 의 차이점이 무엇인지 궁금 할 것 입니다. 저자는 반면, 원래 패치를 쓴 사람 커미터가 마지막으로 패치를 적용하는 사람입니다. 따라서 프로젝트에 패치를 보내고 핵심 멤버 중 하나가 패치를 적용하면 작성자와 핵심 멤버가 커미터로 인정됩니다.

원본 포스터는 다음과 같이 묻습니다.

커미터를 다른 사용자에게도 설정해야합니까?

아닙니다. 정직하고 싶다면 저자와 커미터가 같은 사람이 아닌 한 커미터를 저자에게 설정해서는 안됩니다.


1
나는 아직도 이것에 대해 혼란스러워한다. 나는 이런 일이 있었으며, 내가 아는 한, 패치 또는 히스토리 재 작성이 발생하지 않았다 (일부 git 명령이 불투명하게 "후드"아래에서 패치를 생성하고 적용하지 않는 한). 이것이 실제로 이런 일이 일어날 수있는 유일한 두 가지 방법입니까?
cowlinator 2019

2
또한 저자를 "코드를 작성한 사람"이라고 부르는 것은 의미가 없습니다. git은 누가 그것을 썼는지 어떻게 알 수 있습니까? 당신은 설정하면 git config user다음 git addgit commit다음 자식 추가 누구인지하고 최선을 다하고있는 사람,하지만 여전히 그것을 쓴 사람을 알고하지 않을 것입니다.
cowlinator

1
@cowlinator 누가 코드를 썼는지 모른다. 그것이 당신이 아니라면, 당신이 그것을 말해야하는 이유입니다. git이 발명되기 이전의 이전 분산 버전 제어 시스템은 적용 할 패치가 포함 된 프로젝트 관리자에게 ~~ Linus ~~를 전송했음을 명심하십시오. 이 기능은 ~~ Linus ~~ 관리자가 커밋 메시지에 임시가 아니라 '공식적인'방식으로 패치를 적용하면서 패치를 적용 할 수 있습니다.
기금 모니카의 소송

92

메일 링리스트 + git format-patch+ git apply는 저자를 생성 할 수 있습니다! = 커미터

패치가있는 Linux 커널과 같은 프로젝트에서 :

다른 작성자 및 커미터로 단일 새 커밋 생성

  • 저자는 누가 패치를 썼는가
  • 커미터는 누가 프로젝트 관리자이며 패치를 병합 한 사람입니다.

예를 들어 무작위로 선택된 패치와 해당 커밋을 참조하십시오.

GitHub 및 GitLab과 같은 Git 웹 인터페이스는 작성자를 생성하거나 생성하지 않을 수 있습니다! = 커미터

Git (Hub | Lab)은 동일한 머신에서 업스트림 및 포크 리포지토리를 모두 보유하므로 다음 중 하나를 포함하여 로컬에서 수행 할 수있는 모든 작업을 자동으로 수행 할 수 있습니다.

  • 병합 커밋을 만듭니다.

    author! = committer를 생성하지 않습니다.

    SHA 또는 새 커밋을 그대로 유지하고 새 커밋을 만듭니다.

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

    역사적으로 이것은 GitHub에서 사용 가능한 첫 번째 방법이었습니다.

    로컬에서는이 작업을 수행합니다 git merge --no-ff.

    풀 요청 당 두 개의 커밋을 생성하고 git 기록에 포크를 유지합니다.

  • 위에 기지를 세우다 master

    또한 GitHub는 커밋을 해킹하여 커미터 == 병합 버튼을 누를 사람을 설정합니다. 이것은 필수 사항은 아니며 기본적으로 로컬에서 수행 git rebase하지는 않지만 프로젝트 관리자에게 책임을 부여합니다.

    자식 트리는 다음과 같습니다 :

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

    git apply이메일 패치 와 정확히 같습니다 .

현재 GitHub에서 :

  • 병합 버튼의 드롭 다운을 통해 병합 할 때 방법을 선택합니다
  • 소유자가 repo 설정에서 메소드를 사용 또는 사용하지 않도록 설정할 수 있습니다.

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
    

    어디 cncd스탠드 Committer NameCommitter Date

  • fuller사전 정의 된 형식을 사용하십시오 .

    git log --format=fuller
    

    참조 : '커밋 날짜'를 표시하도록 'git log'를 구성하는 방법

  • 낮은 수준으로 이동하여 전체 커밋 데이터를 표시하십시오.

    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 commit 객체의 파일 형식은 무엇입니까?

기본적으로 커밋은 텍스트 파일이며 두 줄로 구분 된 필드를 포함합니다.

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

이것은 커밋 객체에서 두 개의 완전히 독립적 인 데이터 엔트리라는 것을 분명히합니다.


1
GIT_COMMITTER_*재정의 를 사용하더라도 git은 기본 커미터를 설정하지 않은 경우 커밋 수행을 거부합니다 git config.
adelphus

1
둘 다 설정 한 경우 @adelphus 힘내 2.5에,이 작업을 수행GIT_{COMMITTER,AUTHOR}_EMAIL
치로 틸리郝海东冠状病六四事件法轮功

3

@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호출에 변수를 사용합니다 (이중 괄호 참조).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.