2016-01-21 107 views
0

我有这个补丁文件,它包含了一堆我想应用于git分支的修改。但我不想做一个独特的提交所有这些修改,而是我想分裂成2或3提交Git单线程交互地应用补丁

我知道我可以通过首先应用补丁,然后做一个互动附加(由大块大块),像这样实现的:

git apply mypatch 
git add -p 

我只是想知道如果有可能做到这一点的一个git命令。 我在git apply的手册页中找不到任何内容,也没有在git add中找到任何内容。

编辑

我不认为这个问题应该被视为Syntax for Git aliases with multiple commands重复为这个问题(和它的答案)不需要不涉及传给别名参数。

+0

为什么downvoted?只是好奇 – arainone

+0

你可以使用一个别名来组合它们,或者如果你想用新的组合命令保持git-like语法的话可以使用一个函数。 – 8bittree

+0

@ 8bittree这似乎是一个很好的解决方案。你愿意在答案中给我提供这样一个别名(或函数)吗? – arainone

回答

1

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

至少有2种方法来做到这一点:

  • 使用壳函数see 8bittree's answer
  • 使用git的别名。我喜欢这种解决方案,因为它仅涉及.gitconfig,无需修改.bashrc,和git壳完成作品为新的别名,它是并排示在完成列表中的其他标准的Git命令

因此,这是什么最后我添加到我的全球.gitconfig

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

然后我只需要做:

git ipatch mypatchfile 
-1

您可以使用unix“patch”命令(与git分开)。这样Git就不会知道任何关于'补丁'的信息--- Git会认为你经常编辑。的“混帐表演”和“git的差异”输出与UNIX的“补丁”命令兼容:

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

在这一点上,你可以使用“混帐添加” /“git的承诺”,以创建序列的承诺你想。

+0

在这种情况下'git apply'做同unix'patch'一样,不多不少。如果这是您的想法,修改后的文件不会进行提交。此外,问题是要找到一种方法来在一个命令中执行交互式的'git apply' – arainone

1

正如我的评论中提到的,你可以通过函数获得类似的效果。经过一番思考之后,我不确定别名是否可行,因为您需要指定补丁文件和可能的某些选项。这里有一个示例函数可以添加到.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 "[email protected]" 
     /usr/bin/git add -p 
    else 
     /usr/bin/git "[email protected]" 
    fi 
} 

如果你想添加更多的自定义Git命令,它可能是值得寻找到一个case statement,而不是if秒的长链。