your programing

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

lovepro 2020. 10. 5. 20:33
반응형

주어진 커밋에 대한 푸시 날짜를 얻는 방법이 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 master. 아마도 원하는 정확한 형식은 아니지만 올바른 방향을 가리켜 야합니다.

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


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


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


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 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

So, if you and other developers are doing git rebase before git push, you will end up with a commit date that is later than the author date.

This command shows the commit date: git log --pretty=fuller


I guess you can use next notation to obtain the push date: git log -g --date=local

참고URL : https://stackoverflow.com/questions/6795070/is-there-a-way-in-git-to-obtain-a-push-date-for-a-given-commit

반응형