如何使命令类似于“git rebase -i”

时间:2016-10-11 14:19:34

标签: git

我正在尝试为git编写自定义命令。我希望它的行为类似于git rebase -i,其中文件在VIM中打开并且写入+退出该文件将触发更多代码。

我所指的是

的例子

运行git rebase -i时,将打开此文件:

noop

# Rebase 3ffddbe..3ffddbe onto 3ffddbe (1 command(s))
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

通常在那里有提交哈希,你可以挤压或其他什么。我想要一些类似的东西,我可以运行我的自定义git edmund命令,它会在文件中打开结果。

所以我的目标是:

1)git edmund

2)编辑打开的文件。我希望内容看起来像这样(基本上是git log -n 3 --pretty=format:"%H %cN"的结果):

3ffddbebbfb8eef48e69ca455628bd8b94f00eed Edmund
5ae79d3d7b0e8b33d0f3dcc366439e62e5703e1d Charlie
2063a5fce18972fee0bfa589ee2e2668f5a026f9 Kevin

3)运行解析该文件的代码

2 个答案:

答案 0 :(得分:3)

创建脚本名称git-edmund,将其放在$PATH中的某个位置,并确保它是可执行的。脚本可能应该做类似......

#!/bin/sh
tmpfile=$(mktemp gitXXXXXX)
trap "rm -f $tmpfile" EXIT
git log -n 3 --pretty=format:"%H %cN" > $tmpfile
${VISUAL:-${EDITOR:-vi}} $tmpfile
...do stuff with $tmpfile here...

现在,当您运行git edmund时,它将运行您的git-edmund脚本,您可以在其中执行所需的任何逻辑。

答案 1 :(得分:1)

您可以使用自定义shell函数创建自己的git alias。它可能看起来像这样:

[alias]    
edmund = "!ed() { git log -n 3 --pretty=format:\"%H %cN\" | vim - ; }; ed"

因此,当您执行git edmund时,它将打开vim编辑器,其中包含3个最新提交。这不是理想的行为,但你可以从它开始并改进它。我希望它有所帮助。