【问题标题】:change git history (commit date) of *n* commits with shell script使用 shell 脚本更改 *n* 次提交的 git 历史记录(提交日期)
【发布时间】:2019-12-29 21:17:42
【问题描述】:

我的问题的大图:

我想在今天的最后n次提交中写一个脚本到change the history,例如:./myscript.sh 5将更改提交日期 的最后 5 次提交到 today。

来自this link,我可以:

  1. 将上次提交的日期设置为当前日期
  2. 将最后一次提交的日期设置为任意日期
  3. 将任意提交的日期设置为任意日期或当前日期

因为我想要的是更改最后 n 次提交的历史记录,而不仅仅是 1,所以我必须使用第三种技术,它需要调用 git rebase -i 并打开一个编辑器.我想编写一个脚本来自动执行此任务。


这是手动完成任务的方式(将最近 5 次提交的提交日期更改为今天):

git rebase -i HEAD~5

然后它打开编辑器

pick 81888d1 committed 9 months ago
pick 7363124 committed a month ago
pick eea43f7 committed yesterday
pick 48c3e85 committed yesterday
pick a62cbec commit recently
# change all the `pick` to `edit`

关闭编辑器,重复以下5次

GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
git rebase --continue

完成。


约束:因为我提前知道我在编辑器中所做的部分是将所有pick 关键字替换为edit,所以我希望它静默完成。只需输入./myscript.sh 5 即可完成工作,没有打开编辑器。我该如何做到这一点(在脚本中)?


在答案的帮助下,这是我的最终脚本:

#!/bin/bash

# wish design:
#./myscript.sh [number of days]
#./myscript.sh 5 # make the last 5 commits's commit dates to today

declare -r integer_pattern="^[0-9]+$"

if [[ $1 =~ $integer_pattern ]]; then
  count=$1

  GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick /e /'" git rebase -i "HEAD~$count"

  for ((i=0; i<count; i++)); do
    GIT_COMMITTER_DATE="$(date)" git commit --amend --no-edit --date "$(date)"
    git rebase --continue
  done

else
  echo "invalid argument [number of days] $1"

fi

【问题讨论】:

  • 这能回答你的问题吗? Git interactive rebase without opening the editor
  • 好像有人问了一个相关的问题,但我不明白他们在说什么。有人可以以更适合初学者的方式解释它吗?就像在我的情况下我应该做什么?我应该在终端上输入什么?为了完成工作,我应该在脚本上写些什么?
  • 是否有特定需要使用interactive rebase?我的意思是...如果你想让你的脚本在没有用户干预的情况下做一些事情,你为什么要首先交互式地运行 rebase ?我想您可以使用 rebase without -i 或使用cherry-picks 来获得乐趣,然后就无需关心交互式 rebase control-by-the-editor 部分了。
  • @eftshift0 我主要是一个初学者,试图利用我已经知道的有限知识。老实说,我对rebase 的了解只是rebase -i 将多个提交合并 为一个。我正在做的是编写一个脚本,将n 的最后一次提交和edit/e 合并为一个rebase -i 到change the date commit to today。就像./myscript.sh 5 会将最后 5 个提交合并为一个,并将该合并提交的日期提交更改为 today。

标签: git shell git-rebase git-rewrite-history


【解决方案1】:

将 n 次提交压缩为一个可以在没有变基交互的情况下完成.... 甚至根本没有变基。要压缩最后 5 次提交,您可以这样做:

git reset --soft HEAD~5
git commit -m "some comment"

你已经完成了

【讨论】:

  • 真的很抱歉,我错误地描述了我的问题,我不需要将这些提交合并为一个,只是为了更改它们的提交日期,因为我相应地编辑了我的问题。无论如何,这个答案确实帮助我学习了新事物,如果有一天我需要合并最后 5 次提交并更改其提交日期(正如我错误描述的那样),这显然是可以挽救我一天的答案。
【解决方案2】:

如here所述。

交互式变基会在提交列表中打开默认的$EDITOR。它也可以被名为GIT_SEQUENCE_EDITOR的环境变量覆盖,因此您需要拦截调用并将此变量与一些脚本一起使用

运行:GIT_SEQUENCE_EDITOR=&lt;script&gt; git rebase -i &lt;params&gt;。您的 &lt;script&gt; 应该接受一个参数:包含标准变基提交列表的文件的路径。它应该就地重写它并退出。之后发生通常的变基处理。

例子:

GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick /e /'" git rebase -i

但是你也可以使用一些 bash/python/whatever 脚本来代替。

【讨论】:

  • 谢谢,看起来你正在提供我想要的东西,但我还没有完全理解,当我完全解决我的问题时,我会标记接受的答案。抱歉,我还是个初学者,有一些我不知道的术语,例如提交列表中的 $EDITOR、名为 GIT_SEQUENCE_EDITOR 的环境变量、.. . 但我想我很快就会弄明白的。
猜你喜欢
  • 2021-02-22
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 1970-01-01
  • 2021-01-06
  • 2012-04-06
  • 2021-09-14
  • 2021-12-14
相关资源
最近更新 更多