是否可以做以下?
- 让
git rebase --interactive
只输出标准的样板到一个文件中,而不是输出到文件,并在编辑器中打开它。 - 让用户编辑文件。
- 让用户重新运行
git rebase
与编辑的文件名。 - 继续与通常的rebase过程。
用例:当然脚本垫底。 请参阅如何重新排序在Git修订非交互的例子。
是否可以做以下?
git rebase --interactive
只输出标准的样板到一个文件中,而不是输出到文件,并在编辑器中打开它。 git rebase
与编辑的文件名。 用例:当然脚本垫底。 请参阅如何重新排序在Git修订非交互的例子。
经过一番思考和研究,得到的回答竟然是微不足道的: git rebase -i
需要编辑的名字来自著名的EDITOR / VISUAL环境变量,因此替代在指向一个非交互式脚本做这项工作。
然而,EDITOR / VISUAL漠然适用于提交的名单,重述和其他任何时候提交信息。 所以,既然http://git.kernel.org/?p=git/git.git;a=commit;h=821881d88d3012a64a52ece9a8c2571ca00c35cd ,有这仅适用于提交列表中一个特殊的环境变量GIT_SEQUENCE_EDITOR。
因此,配方重新排序或压扁的提交是:
运行: GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>
。 您<script>
应该接受一个参数:路径包含标准的重订提交列表中的文件。 应该就地和退出重写。 之后通常衍合处理情况。
扩大对pfalcon的回答:
运行
GIT_SEQUENCE_EDITOR=<script> git rebase -i <params>
。<script>
应该接受单个参数-到文件包含标准底垫提交列表路径。 该脚本应就地和退出重写。 之后通常衍合处理情况。
如果您有一个包含你想要的内容的环境变量:
GIT_SEQUENCE_EDITOR='echo "$REBASE_DATA" >' git rebase -i [<additional params>]
Catting文件将工作太:
GIT_SEQUENCE_EDITOR='cat rebase_data_file >' git rebase -i [<additional params>]
添加到@ pfalcon的回答,您可以用sed为您GIT_SEQUENCE_EDITOR。 例如,我想编辑每个提交,所以我这样做:
GIT_SEQUENCE_EDITOR="sed -i -re 's/^pick /e /'" git rebase -i
我使用这个脚本(它添加允许简化犯分裂):
#!/bin/bash
ACTION=$1
COMMIT=$(git rev-parse --short $2)
[[ "$COMMIT" ]] || exit 1
CORRECT=
for A in p pick r reword e edit s squash f fixup x exec d delete t split; do
[[ $ACTION == $A ]] && CORRECT=1
done
[[ "$CORRECT" ]] || exit 1
if [[ $ACTION == "delete" || $ACTION == "d" ]]; then
GIT_SEQUENCE_EDITOR="sed -i -e '/^pick $COMMIT/d'" git rebase -i $COMMIT^^
elif [[ $ACTION == "split" || $ACTION == "t" ]]; then
GIT_SEQUENCE_EDITOR="sed -i -e 's/^pick $COMMIT/edit $COMMIT/'" git rebase -i $COMMIT^^ || exit 1
git reset --soft HEAD^
echo "Hints:"
echo " Select files to be commited using 'git reset', 'git add' or 'git add -p'"
echo " Commit using 'git commit -c $COMMIT'"
echo " Finish with 'git rebase --continue'"
else
GIT_SEQUENCE_EDITOR="sed -i -e 's/^pick $COMMIT/$1 $COMMIT/'" git rebase -i $COMMIT^^
fi
一个别名添加到您的.gitconfig:
[alias]
autorebase = ! path_to_your_script
您可以使用touch
作为将触及该文件,因此它会出现修改的编辑器。 例如
GIT_SEQUENCE_EDITOR=touch git rebase -i [commit]
别名它,给baseline
的标签我想对变基
git config alias.baseline '!GIT_SEQUENCE_EDITOR=touch git rebase -i baseline'
别名Windows环境下工作,因为它执行shell是bash
不是cmd
。
互动模式带来了集编辑器一起工作。
在使用编辑器可以用检索:
git config --get core.editor
所以,如果你设置了非交互式的编辑器-这是接受标准输入的命令编辑器,你可以工作--interactive
以非交互的方式:)
我知道肯定vim
接受命令,所以做标准的编辑 ed
着,当然。
所以,保持交互式编辑器(如果想)
$ ied="$(git config --get core.editor)"
设置非交互式编辑器
$ git config --unset-all core.editor
$ git config --add core.editor ed
并用它做的工作..
$ printf '%s\n' "some-ed-cmd" "another-ed-cmd" "wq" | git rebase -i HEAD~5
并恢复编辑器(如果想)
$ git config --unset-all core.editor
$ git config --add core.editor "$ied"
基于Jezz的答案 ,我做了一个shell脚本无关( GitReb ),其与多个参数的修改,作品:/<text>
语法,根承诺,也做一些完整性检查。
我还做了更简单,除去t
/ split
的动作,并delete
- > drop
转换其IMO超出这个脚本的范围。