Git:如何防止提交仅用于调试目的修改过的文件?

8
很多时候,我喜欢修改一些代码行以使调试更容易,但实际上我并不想提交它们。例如,我会通过注释掉一些代码行来禁用一些烦人的功能(如广告),或者我会设置日志级别和过滤器为我关心的内容,或者我会强制一个条件为真,以便我想要运行的代码块始终运行。
在Perforce中,我将为这些文件创建一个"changelist"并标记为"DON'T COMMIT!"。在Git中,相当于这个操作是什么?分支不起作用,因为这些仅用于调试的修改需要与我当前进行的其他更改共存。
5个回答

5

第二个链接有很好且易懂的解释。 - TroodoN-Mike

3
感谢各位的答复。我最终编写了一个git的pre-commit钩子,检查每个文件中是否包含字符串“dont commit”(以及其他变体)。如果是的话,提交就会失败,我必须在提交之前编辑这些行。这是因为调试代码应该按照每行而不是按照每个文件来处理,因为有些文件既有调试更改又有真实更改需要提交。(我的旧解决方案并没有解决这个问题)。

能否分享 pre-commit hook 脚本? - Revaapriyan

1

我通常做的是将调试代码放在自己的提交中,并稍后撤销该提交。 更详细的解决方案是从master创建一个中间分支,称为debug。 在debug分支中进行所有调试更改,然后在debug上分离您的功能分支。 当您准备好删除调试更改时,只需将您的特性分支变基到master即可。


0

你实际上不想忽略那些文件,而是忽略那些更改。

我看到这里有两个解决方案:

  1. 恢复 HEAD

我在这种情况下使用的命令是:

git checkout -- file ...

使用您为调试目的修改过的所有文件。

这将还原文件至HEAD。 然后你可以安全地进行git commit -a或其他操作。

  1. 告诉Git询问您要提交的更改(按文件)

    git add -p .

请参见#1085162

但您仍需要删除调试代码。


0

其中一个解决方案并不通用,但可能适用于某些工作流场景,就是应用Git的预提交过滤器(手册手册+示例)。简而言之,它只是一个预处理工具,在实际提交之前将被调用以处理所有已提交的文件。您可以使用此机制来剥离某些模式,例如//<NOCOMMIT ... //NOCOMMIT>或其他您喜欢的内容。缺点是这些调试行可能会在重置到提交状态甚至拉取/合并时消失(我没有检查过)。


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