我的问题的概况:
我想编写一个脚本,以将最后n次提交的历史记录更改为今天,例如:./myscript.sh 5
将最后5次提交的提交日期更改为今天。
通过此链接,我可以:
因为我要更改的是最后n次commits的历史记录,而不仅仅是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将$EDITOR
在提交列表上打开默认值。还可以通过名为的env变量来覆盖它GIT_SEQUENCE_EDITOR
,因此您需要拦截该调用并将此变量与某些脚本一起使用
运行:GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>
。您<script>
应该接受一个参数:包含标准rebase提交列表的文件的路径。它应该就地重写并退出。此后会进行通常的重新处理。
例:
GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick /e /'" git rebase -i
但是您也可以使用一些bash / python /任何脚本代替。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句