주어진 커밋에 대한 푸시 날짜를 얻는 방법이 git에 있습니까?


92

git 로그의 각 커밋과 관련된 푸시 날짜를 보는 방법이 있는지 궁금합니다. 이것이 가능하지 않은 경우 특정 푸시에서 모든 커밋을 볼 수있는 방법이 있습니까?

커밋을 푸시 할 때 추적해야하는 프로그램을 작성했습니다. git 로그는 푸시 날짜가 아닌 커밋 날짜로 정렬되어 있기 때문에 푸시 된 가장 최근 커밋을 볼 수 없습니다. 예를 들어 사용자가 마스터로 푸시하기 2 일 전에 로컬 저장소에 커밋하면 해당 커밋은 마스터 저장소 로그에서 다른 커밋의 2 일 뒤에 배치됩니다.

답변:


77

흩어져있는 정보를 모으고 마침내이 질문에 대한 가장 좋은 답을 찾는 데 엄청나게 오랜 시간이 걸렸지 만 이제는 알고 있습니다. 단 두 줄로 코드와 후크가 없습니다.

# required for a bare repo
git config core.logAllRefUpdates true

git reflog --date=local master

마침내 간단합니다.

경고 : gc.reflogExpire및 의 기본값을 재정의 할 수 있습니다 gc.reflogExpireUnreachable. git help reflog자세한 내용을 확인 하고 이것이 작동하는 방법과 이유를 이해하십시오.

위의 두 명령은 푸시 한 클론 내에서 실행해야합니다 . 이것이 가능하지 않은 경우 근사치 는 다른 영구 복제 에서 실행하는 것입니다 .

git fetch               origin        # often and *regularly*
git reflog --date=local origin/master

이 영구 클론을 삭제하지 마십시오. 그렇지 않으면 날짜가 손실됩니다.


2
내 경우 에는 푸시 목록을 보려면 git reflog --date=local origin/master(참고 origin/) 해야한다는 것을 추가하고 싶습니다 . 그렇지 않으면 커밋, 체크 아웃, 풀만 목록에 포함되었습니다 (유용함). 실제로 @JonathanDay의 답변 으로 지적되었습니다 .
NIA 2013 년

@NIA : origin / master는 근사값 만 제공합니다. 귀하의 의견에 따라 답변을 업데이트했습니다. 이것이 명확합니까?
MarcH 2013 년

37

Git은 분산 된 버전 제어 시스템이므로 "푸시 날짜"라는 의미를 신중하게 정의해야합니다. 예를 들어 사용자 A가 사용자 B의 저장소에 일부 커밋을 푸시한다고 가정합니다. 나중에 사용자 B가 동일한 커밋을 세 번째 저장소로 푸시합니다. 어느 날짜에 관심이 있습니까?

나는 당신이 공유 리포지토리를 가지고 있고 그 공유 리포지토리의 사용자가 무언가가 언제 리포지토리에 게시되었는지 확인할 수 있기를 원한다고 추측하고 있습니다. 사실이라면 공유 저장소에서 해당 정보를 수집해야합니다.

나쁜 소식

불행히도 커밋 메시지에 날짜를 추가하는 방법은 없습니다. 그러면 커밋 ID (내용의 SHA1 해시)가 변경되어 모든 종류의 문제가 발생합니다.

좋은 뉴스

다행히 Git에는 notes 라는 (상대적으로 새로운) 기능이 있습니다 . 이 기능을 사용하면 git log표시 할 수 있는 커밋에 임의의 텍스트를 첨부 할 수 있습니다. 메모를 편집하고 다른 사람과 공유 할 수 있습니다.

노트 기능을 사용하여 "[날짜]에이 커밋을 받았습니다"메시지를 공유 저장소에서 수신 할 때 각 커밋에 첨부 할 수 있습니다.

자세한 내용은를 참조 git help notes하십시오.

날짜를 기록하는 방법

내가 권장하는 접근 방식은 다음과 같습니다.

  1. post-receive공유 리포지토리 의 후크를 수정하여 업데이트 된 각 참조에 대해 새로 도달 할 수있는 커밋을 각각 이동합니다.
  2. 각 커밋에 대해 "[repository_url]의 [user]가이 커밋을 [date]의 [ref]에 추가했습니다."와 같은 내용을 커밋 메모에 추가합니다.

    refs/notes/received-on기본값 대신 이 용도 (예 :) 전용 메모 참조를 사용할 수 있습니다 refs/notes/commits. 이렇게하면 다른 용도로 만든 메모와의 충돌을 방지 할 수 있습니다.

  3. receive노트 참조에 대한 업데이트를 거부하도록 후크를 수정합니다 (사용자가 실수로 또는 의도적으로 노트를 엉망으로 만들지 못하도록 방지).
  4. 모든 사용자에게 작업 트리 내에서 다음 명령을 실행하도록 지시하십시오.

    # Fetch all notes from the shared repository.
    # Assumes the shared repository remote is named 'origin'.
    git config --add remote.origin.fetch '+refs/notes/*:refs/remote-notes/origin/*'
    
    # Show all notes from the shared repository when running 'git log'
    git config --add notes.displayRef 'refs/remote-notes/origin/*'
    

    이 단계는 Git이 기본적으로 업스트림 리포지토리의 비 분기, 비 태그 참조를 무시하기 때문에 필요합니다.

위의 내용은 참조가 고급 일뿐 삭제되거나 강제 업데이트되지 않는다고 가정합니다. 당신은 아마 가지고 싶은 것 post-receive또한 APPEND 이러한 경우를 처리하기 위해 노트 "[날짜]에 제거"후크를.



8
git reflog show origin/master --pretty='%h %gd %gs %s' --date=iso

이것은 나를 위해 꽤 잘 작동하는 것 같습니다. 커미터 날짜 (% cd)는 푸시 날짜와 반드시 동일하지 않기 때문에 오해의 소지가 있습니다. 그러나 --date = iso 옵션 은 푸시 / 페치 날짜를 출력합니다 .

원본 / 마스터에서 가져온 경우 가져온 날짜가 인쇄됩니다. 다른 사람이 커밋을 푸시 한 날짜가 아닙니다.

 - %h:  abrev. hash
 - %gd: human readable reflog selector
 - %gs: reflog subject
 - %s:  subject/commit message

보너스 : 물론 더 예쁜 서식을 지정할 수 있습니다. 지금까지이 색상 코딩이 마음에 듭니다. 그래도 타이핑하는 것이 약간 많습니다. 이렇게하면 SHA가 빨간색으로, 선택기가 청록색으로 다시 기록되며, 녹색으로 다시 기록됩니다.

git reflog show origin/master --pretty='format:%C(red)%h%Creset %C(cyan)%gd%Creset %C(green)%gs%Creset: %s' --date=iso

안녕하세요 VC는 "reflog show origin / master --pretty = '% Cred % h % Creset-% C (yellow) % gd % Creset % Cblue (% gs) % Creset % s'- -date = iso "는"da4c192cd -origin / master @ {2019-02-07 08:13:40 +0100} (풀 : 빨리 감기) JIRA-2542 향상 테스트 보고서 "입니다. 그러면 내 지점 JIRA의 내용을 의미합니다. -2542는 2019-02-07 08:13:40에서 빨리 감기를 통해 오리진 / 마스터에 병합되었습니다.
Simon

안녕 사이먼, 네. 브랜치에서 git pull을했고 그 당시 fast-forward를 통해 origin / master에 병합되었습니다.
VC

작성자의 저장소에서만 작동합니다. 저장소를 복제하면 값이 비어 있습니다. 다른 사람의 푸시 시간을 볼 수 없습니다.
ramwin

6

를보세요 git reflog show master. 아마도 원하는 정확한 형식은 아니지만 올바른 방향을 가리켜 야합니다.

또 다른 아이디어는 푸시 후크 내부에서 스크립트를 실행하는 것입니다.


푸시 훅을 실행하는 것에 대해 생각했지만 마지막 도랑 노력이어야 할 것 같습니다. 후크를 사용하면 모든 사용자가 각 저장소에 해당 후크를 가져야하는 것처럼 보입니다. 에 대해 좀 더 구체적으로 말씀해 주 git reflog show master시겠습니까? 모든 사용자의 개별 커밋의 푸시 날짜를 볼 수 있기를 원합니다.
justkikuchi 2011

git reflog는 실행중인 저장소의 변경 순서 를 보여줍니다 . 날짜를 직접 가져 오는 방법이 있는지 확실하지 않지만 그 안에 .git/logs/refs/heads/master타임 스탬프가 표시됩니다.
Karl Bielefeldt

3
후크에 관해서는, 당신이 밀어 컴퓨터에서 실행 후크가받습니다 로를 . 푸시는 특정 리포지토리와 관련이 있기 때문에 실행하려는 특정 "축복 된"리포지토리가 있다고 가정합니다. git reflog그 문제도 마찬가지 입니다.
Karl Bielefeldt

5

원격에서 reflog를 검사하는 것과 관련된이 답변은 어떤 커밋이 푸시되었는지는 표시하지 않지만 브랜치를 통해 푸시 된 브랜치에 대한 정보를 제공함으로써 도움이 될 수 있습니다 ( https://stackoverflow.com/a/8791295/336905 ). 로컬 커밋 날짜 이후의 다음 푸시를 찾아 상호 연관시킬 수 있습니다. 완벽하지는 않지만 이전에 게시 한 @RichardHansen의 훌륭한 메모 제안을 아직 구현하지 않은 경우 편리합니다.


1
의 reflog는 현재 컴퓨터 origin/branch의 변경 사항 만 표시하므로 매우 유용합니다! 일상적인 사용을 위해 저는 어떤 후크도 구현하고 싶지 않습니다. 그래서 간단한 질문 "음, 지난주에 커밋을 푸시했을 때?" — 훌륭하게 작동합니다.
NIA 2013 년

4

서버 자체의 git 저장소에있는 "objects"디렉토리에서 커밋 개체 파일의 파일 수정 시간을 볼 수도 있습니다.


3

git AuthorDate가 CommitDate와 다른 이유는 무엇입니까?

  • AuthorDate 커밋이 처음 생성되었을 때입니다.
  • CommitDate 커밋이 마지막으로 수정 된 때입니다 (예 : rebase).

--pretty서식 옵션을 사용하여 가져올 수 있습니다 .

       o    %cd: committer date
       o    %cD: committer date, RFC2822 style
       o    %cr: committer date, relative
       o    %ct: committer date, UNIX timestamp
       o    %ci: committer date, ISO 8601 format

따라서 귀하와 다른 개발자가 git rebase이전 에 작업하는 경우 작성자 날짜 보다 늦은 커밋 날짜로git push 끝납니다 .

이 명령은 커밋 날짜를 표시합니다. git log --pretty=fuller


1

다음 표기법을 사용하여 푸시 날짜를 얻을 수 있다고 생각합니다. git log -g --date = local

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