【发布时间】:2019-12-29 21:17:42
【问题描述】:
我的问题的大图:
我想在今天的最后n次提交中写一个脚本到change the history,例如:./myscript.sh 5将更改提交日期 的最后 5 次提交到 today。
来自this link,我可以:
- 将上次提交的日期设置为当前日期
- 将最后一次提交的日期设置为任意日期
- 将任意提交的日期设置为任意日期或当前日期
因为我想要的是更改最后 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
【问题讨论】:
-
好像有人问了一个相关的问题,但我不明白他们在说什么。有人可以以更适合初学者的方式解释它吗?就像在我的情况下我应该做什么?我应该在终端上输入什么?为了完成工作,我应该在脚本上写些什么?
-
是否有特定需要使用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