programing

커밋 타임스탬프를 변경하지 않고 gitrebase

mailnote 2023. 6. 30. 22:31
반응형

커밋 타임스탬프를 변경하지 않고 gitrebase

당신이 이 일을 할 수 있습니까?git rebase커밋 타임스탬프를 보존하는 동안?

저는 그 결과 새로운 지점에 반드시 연대순으로 커밋 날짜가 있는 것은 아니라고 생각합니다.이론적으로 가능합니까? (예: 배관 명령을 사용합니다. 여기서 궁금할 뿐입니다.)

이론적으로 가능하다면 타임스탬프를 변경하는 것이 아니라 rebase를 사용한 실습이 가능한가요?

예를 들어 다음과 같은 트리가 있다고 가정합니다.

master <jun 2010>
  |
  :
  :
  :     oldbranch <feb 1984>
  :     /
oldcommit <jan 1984>

이제, 내가 베이스를 바꾸면,oldbranchmaster커밋 날짜가 1984년 2월에서 2010년 6월로 변경됩니다.커밋 타임스탬프가 변경되지 않도록 해당 동작을 변경할 수 있습니까?결국 나는 다음을 얻게 될 것입니다.

      oldbranch <feb 1984>
      /
 master <jun 2010>
    |
    :

그게 말이 됩니까?이전 커밋이 부모로서 더 최근 커밋을 갖는 이력을 갖는 것이 허용됩니까?

2014년 6월 업데이트: David Fraser는 댓글에서 옵션을 사용하여 "Git 분기를 재배치하는 동안 타임스탬프 변경"에도 자세히 설명된 솔루션을 언급했습니다.--committer-date-is-author-date(commit 3f01ad6에서 2009년 1월에 처음 도입되었습니다.

로 고는 다음과 .--committer-date-is-author-date옵션은 작성자 타임스탬프를 남기고 커밋 타임스탬프를 원래 작성자 타임스탬프와 동일하게 설정하는 것으로 보이는데, 이는 OP Olivier Verdier가 원하는 것입니다.

올바른 날짜의 마지막 커밋을 찾아 다음 작업을 수행했습니다.

git rebase --committer-date-is-author-date SHA

참조:

--committer-date-is-author-date

기본적으로 명령어는 전자 메일 메시지의 날짜를 커밋 작성자 날짜로 기록하고 커밋 작성 시간을 커밋 날짜로 사용합니다.
이렇게 하면 작성자 날짜와 동일한 값을 사용하여 커밋 날짜에 대해 거짓말을 할 수 있습니다.

(), 파일: Git 2.29 (2020년 4분기), Gitrebase--committer-date-is-author-date또는--ignore-date또한 다음과 같이 작동합니다.

  • rebase 리베이스)rebase -i/rebase --interactive)
  • commit 커밋)에 대해git rebase --root)

"Git 분기의 기본을 변경하는 동안 타임스탬프 변경"을 참조하십시오.


(원답, 2012년 6월)

당신은 시도할 수 있어요, 상호 작용하지 않는 리베이스를 위해.
위 , 2020년 , (사용자: Git 2.29, 2020년 4월)

git rebase --ignore-date

(이 SO 답변에서)

이 정보는 에 전달되며, 에 다음 사항이 언급됩니다.

 --ignore-date

기본적으로 명령어는 전자 메일 메시지의 날짜를 커밋 작성자 날짜로 기록하고 커밋 작성 시간을 커밋 날짜로 사용합니다.
이렇게 하면 커밋 날짜와 동일한 값을 사용하여 작성자 날짜에 대해 거짓말을 할 수 있습니다.

의 경우 이 선택사항은 " --interactive 선택사항과 호환되지 않음"입니다.

이전 커밋 날짜의 타임스탬프를 마음대로 변경할 수 있기 때문에 원하는 커밋 날짜 순서로 Git 내역을 구성할 수 있으며 미래로 설정할 수도 있습니다!


올리비에가 그의 질문에서 언급했듯이, 저자의 날짜는 절대 기본적으로 변경되지 않습니다.
Pro Git Book에서:

  • 저작자는 그 저작물을 최초로 작성한 사람,
  • 반면에 커미셔너는 작업을 마지막으로 적용한 사람입니다.

프로젝트에 패치를 보내고 핵심 구성원 중 한 명이 패치를 적용하면 둘 다 크레딧을 받을 수 있습니다.

이 경우 올리비에가 언급한 것처럼 특히 명확하게 하기 위해:

가 이루려고 했던 것과 반대되는 일을 합니다!
"commit timestamps!"로합니다.
그래서 제 질문에 대한 정답은 다음과 같습니다.
다음 이후로 아무것도 하지 마십시오.git rebase기본적으로 작성자의 타임스탬프는 변경되지 않습니다.


딜런 영이 논평에서 덧붙인 것처럼, "기트레베이스 동안 해시를 사용하여 충돌하는 커밋을 식별하는 방법은 무엇입니까?":

SEQUENCE_EDITOR의 variable과 rebase interactive를 합니다.todo합니다.GIT_COMMITER_DATE에서 각 전의 todo.

원래 커밋 목록을 가지고 있기 때문에(찾기 위해 git 내부를 해킹할 필요가 없음) 조금 덜 귀찮지만, 전체 목록을 한 번에 처리해야 하기 때문에 조금 더 많은 작업이 필요합니다.

원래 커밋을 식별할 수 있게 되면 다음과 같은 작업을 수행할 수 있습니다.

git rebase -x 'GIT_COMMITTER_DATE="git show -s --format=%ci ``get_current_commit``" git commit --amend --no-edit

커밋 날짜를 이미 망쳐 놓고(아마도 리베이스로) 해당 작성자 날짜로 재설정하려는 경우 다음을 실행할 수 있습니다.

git filter-branch --env-filter 'GIT_COMMITTER_DATE=$GIT_AUTHOR_DATE; export GIT_COMMITTER_DATE'

Von C에 대한 결정적인 질문은 제가 무슨 일이 일어나고 있는지 이해하는 데 도움이 되었습니다. 당신의 기본을 바꿀 때, 커미셔너의 타임스탬프는 변경되지만 저자의 타임스탬프는 변경되지 않습니다. 갑자기 모든 것이 이치에 맞습니다.그래서 제 질문은 사실 충분히 정확하지 않았습니다.

답변은 rebase가 실제로 작성자의 타임스탬프를 변경하지 않는다는 것입니다(그러기 위해 아무것도 할 필요가 없습니다). 이것은 저에게 완벽하게 맞습니다.

기본적으로 Gitrebase는 커밋의 타임스탬프를 새 커밋이 작성된 시간으로 설정하지만 작성자의 타임스탬프는 그대로 유지합니다.대부분의 경우 이 동작은 원하는 동작이지만 일부 시나리오에서는 커미셔너의 타임스탬프도 변경하지 않습니다.어떻게 하면 그것을 이룰 수 있을까요?자, 여기 제가 평소에 하는 요령이 있습니다.

먼저, 기준을 변경하려는 각 커밋에 고유한 커밋 메시지와 작성자 타임스탬프가 있는지 확인합니다(여기가 트릭 니즈 개선점이며, 현재는 제 니즈에 맞습니다).

기본 재배치 전에 파일로 재배치될 모든 커밋의 커밋 타임스탬프, 작성자 타임스탬프 및 커밋 메시지를 기록합니다.

#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/심판을 보다

또한 작성자의 타임스탬프와 유사한 작업을 수행할 수 있습니다.

예를 들어 일부 커밋에 대한 작성자의 타임스탬프가 순서가 맞지 않고 이러한 커밋을 재정렬하지 않고 작성자의 타임스탬프만 순서대로 표시하면 다음 명령이 도움이 됩니다.

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'

진짜 해결책은 레딧에서 나온 것 같습니다.여기에 약간 증가된 것이 있습니다.

git -c rebase.instructionFormat='%s%nexec GIT_COMMITTER_DATE="%cD" git commit --amend --no-edit --allow-empty --allow-empty-message' rebase -i

post-rewrite갈고리

이 후크는 모든 작업에 사용할 수 있습니다.git rebase,git pull --rebase그리고.git commit --amend.

.git/continue/post-continue

set -eu
echo post-rewrite
if [ ! "${CIROSANTILLI_GITHOOKS_DISABLE:-0}" = 1 ]; then
  declare -a olds
  declare -A oldnew
  while IFS= read -r line; do
    echo "$line"
    old="$(echo "$line" | cut -d ' ' -f1)"
    new="$(echo "$line" | cut -d ' ' -f2)"
    oldnew[$old]="$new"
    olds+=("$old")
    news+=("$new")
  done
  git reset --hard "${news[0]}~"
  for old in "${olds[@]}"; do
    new="${oldnew[$old]}"
    git cherry-pick "$new" &>/dev/null
    olddate="$(git log --format='%cd' -n 1 "$old")"
    CIROSANTILLI_GITHOOKS_DISABLE=1 \
      GIT_COMMITTER_DATE="$olddate" \
      git commit \
      --amend \
      --no-edit \
      --no-verify \
      &>/dev/null \
    ;
  done
  echo
fi

GitHub 업스트림.

다음을 잊지 마십시오.

chmod +x .git/hooks/post-rewrite

은 이은좋방다니입법은을 하는 좋은 입니다.--committer-date-is-author-date다른 사용자가 구성을 패치하여 기본값으로 설정하기 전에 선택한 리포지토리에서 기본값으로 설정합니다.

또한 다음과 같은 환경에서도 작동합니다.--committer-date-is-author-date에 노출되지 않은 것처럼 보이는.git pull --rebase.

참고 항목:

Git 2.19, Ubuntu 18.04에서 테스트되었습니다.

다음은 제 경우에 사용한 명령입니다.

GIT_AUTHOR_EMAIL=xaionaro@dx.center git rebase --root -x "bash -c 'git commit --amend --reset-author -CHEAD --date=\"\$(git show --format=%ad -s)\"'"

여기서git show --format=%ad -s와 현재날추니다합출를짜를 합니다.--date다시 시작합니다.그리고.rebase --root -x합니다.bash -c 'git commit --amend --reset-author -CHEAD --date="$(git show --format=%ad -s)"'각 커밋마다

언급URL : https://stackoverflow.com/questions/2973996/git-rebase-without-changing-commit-timestamps

반응형