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

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

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



답변

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

# 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

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


답변

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 이러한 경우를 처리하기 위해 노트 “[날짜]에 제거”후크를.


답변

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

답변

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

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


답변

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


답변

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


답변

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