기본적으로 git rebase는 커미터의 타임 스탬프를 새 커밋이 생성 된 시간으로 설정하지만 작성자의 타임 스탬프는 그대로 유지합니다. 대부분의 경우 이것은 바람직한 동작이지만 일부 시나리오에서는 커미터의 타임 스탬프도 변경하고 싶지 않습니다. 우리는 어떻게 그것을 달성 할 수 있습니까? 글쎄, 여기 내가 일반적으로하는 트릭이 있습니다.
먼저 리베이스하려는 커밋마다 고유 한 커밋 메시지와 작성자 타임 스탬프가 있는지 확인하십시오 (여기서는 트릭 개선이 필요한 곳이며 현재는 내 요구에 맞습니다).
리베이스하기 전에, 커미터의 타임 스탬프, 작성자의 타임 스탬프 및 파일로 리베이스 될 모든 커밋의 커밋 메시지를 기록하십시오.
#NOTE: BASE is the commit where your rebase begins
git log --pretty='%ct %at %s' BASE..HEAD > hashlog
그런 다음 실제 리베이스를 수행하십시오.
마지막으로 커밋 메시지가 동일한 경우 현재 커미터의 타임 스탬프를 파일에 기록 된 타임 스탬프로 바꿉니다 git filter-branch
.
git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%at %s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_COMMITTER_DATE=$__date || cat'
문제가 발생하면 체크 아웃 git reflog
또는 모든 refs/original/
심판을 확인하십시오.
Furthormore, 저자의 타임 스탬프와 비슷한 작업을 수행 할 수 있습니다.
예를 들어, 일부 커밋에 대한 작성자의 타임 스탬프가 순서가 맞지 않고 이러한 커밋을 재 배열하지 않으면 저자의 타임 스탬프가 순서대로 표시되기를 원하면 다음 명령이 도움이됩니다.
git log --pretty='%at %s' COMMIT1..COMMIT2 > hashlog
join -1 1 -2 1 <(cat hashlog | cut -f 1 | sort -nr | awk '{ print NR" "$1 }') <(cat hashlog | awk '{ print NR" "$0 }') | cut -d" " -f2,4- > hashlog_
mv hashlog_ hashlog
git filter-branch --env-filter '__date=$(__log=$(git log -1 --pretty="%s" $GIT_COMMIT); grep -m 1 "$__log" ../../hashlog | cut -d" " -f1); test -n "$__date" && export GIT_AUTHOR_DATE=$__date || cat'