주어진 커밋에 대한 푸시 날짜를 얻는 방법이 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
을 참조하십시오.
날짜를 기록하는 방법
내가 권장하는 접근 방식은 다음과 같습니다.
post-receive
공유 리포지토리 의 후크를 수정하여 업데이트 된 각 참조에 대해 새로 도달 할 수있는 커밋을 각각 수행합니다.각 커밋에 대해 "[repository_url]의 [user]가이 커밋을 [date]의 [ref]에 추가했습니다."와 같은 내용을 커밋 메모에 추가합니다.
refs/notes/received-on
기본값 대신 이 용도 (예 :) 전용 메모 참조를 사용할 수 있습니다refs/notes/commits
. 이렇게하면 다른 용도로 만든 메모와의 충돌을 방지 할 수 있습니다.receive
노트 참조에 대한 업데이트를 거부하도록 후크를 수정하십시오 (사용자가 실수로 또는 고의로 노트를 엉망으로 만들지 못하도록 방지).모든 사용자에게 작업 트리 내에서 다음 명령을 실행하도록 지시하십시오.
# 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
'your programing' 카테고리의 다른 글
Inno Setup : 이전에 설치된 버전을 자동으로 제거하는 방법은 무엇입니까? (0) | 2020.10.05 |
---|---|
수십억 개의 행을위한 최고의 데이터 저장소 (0) | 2020.10.05 |
'내보내기'명령의 기능은 무엇입니까? (0) | 2020.10.05 |
angularJS의 다른 서비스에 서비스 삽입 (0) | 2020.10.05 |
jUnit의 CollectionAssert? (0) | 2020.10.05 |