一个应用补丁的Git单行命令,可进行交互式操作。

5
我有一个补丁文件,其中包含一堆修改,我想将其应用于git分支。但我不想创建一个包含所有这些修改的唯一提交,而是想将其拆分成2到3个提交。
我知道可以通过先应用补丁,然后进行交互式添加(逐个块地添加)来实现此目的:
git apply mypatch
git add -p

我想知道是否可能在一条git命令中完成这个操作。我在“git apply”和“git add”的手册中找不到相关内容。
编辑:我认为这个问题不应该被视为Syntax for Git aliases with multiple commands的重复,因为那个问题(及其答案)不需要涉及传递给别名的参数。

1
为什么被踩了?只是好奇。 - arainone
你可以使用别名将它们组合起来,或者使用函数如果你想要保留类似于 Git 的语法与新的组合命令。 - 8bittree
@8bittree 看起来是个不错的解决方案。您能否在答案中提供这样的别名(或函数)给我? - arainone
可能是具有多个命令的Git别名语法的重复。 - Andrew C
3个回答

8

我正在回复自己的问题,感谢@8bittree的评论。

至少有两种方法可以做到这一点:

  • 使用 shell 函数请参见 8bittree 的回答
  • 使用 git 别名。我更喜欢这个解决方案,因为它只涉及到 .gitconfig,不需要修改 .bashrc,并且 git shell 补全 适用于新的别名,在补全列表中显示在其他标准 git 命令旁边

所以这就是我在全局 .gitconfig 中添加的内容:

[alias]
    # interactive apply patch
    ipatch = "!f() { git apply $1; git add -p; }; f"

我只需要执行以下操作即可:
git ipatch mypatchfile

2

如我在评论中所提到的,您可以通过函数获得类似的效果。经过更多思考,我不确定别名是否可行,因为您需要指定补丁文件和可能的一些选项。这是一个示例函数,您可以将其添加到您的.bashrc文件中,如果您使用的不是Bash shell,则可能需要进行调整。我认为它应该适用于Zsh,也可能适用于Ksh,但我没有对它们进行测试。

function git() {
    # Allows you to call `git ipatch patchfile`
    # Change ipatch to whatever you want the git command to be
    if [[ "$1" = ipatch ]]; then
        shift
        # Specify the full path to git, otherwise infinite recursion
        # Alternatively, name the function something else
        /usr/bin/git apply "$@"
        /usr/bin/git add -p
    else
        /usr/bin/git "$@"
    fi
}

如果您想要添加更多自定义的git命令,建议使用case语句,而不是一长串的if语句。请注意保留HTML标签。

-1

你可以使用Unix的“patch”命令(与Git分开)。这样,Git将不会知道任何关于“patch”的信息---Git只会认为你进行了常规编辑。 “git show”和“git diff”的输出与Unix的“patch”命令兼容:

# assuming "my-git-repo" is clean...
cd my-git-repo
patch -p1 < my.patch
git status

此时,您可以使用 "git add" / "git commit" 来创建您想要的提交序列。


在这种情况下,git apply与Unix的patch做的一样,没有多余的也没有少。如果你是这么想的话,修改后的文件不会被暂存以进行提交。此外,问题是要找到一种交互式执行git apply的方法,只需一个命令即可。 - arainone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接