如何告诉 git 忽略个别行,即特定代码行的 gitignore [重复]

Posted

技术标签:

【中文标题】如何告诉 git 忽略个别行,即特定代码行的 gitignore [重复]【英文标题】:How to tell git to ignore individual lines, i.e. gitignore for specific lines of code [duplicate] 【发布时间】:2013-04-21 03:09:10 【问题描述】:

.gitignore 可以忽略整个文件,但是有没有办法在编码时忽略特定的代码行?

我经常在项目中重复添加相同的调试行,只是必须记住在提交之前删除它们。我想只保留代码中的行,让 git 忽略它们。

【问题讨论】:

我不知道这是一个糟糕的想法还是一个绝妙的想法。 @KyleStrand 至少,我可以将它添加到我输入的调试行中,并且知道它们不会被意外提交,我感到很安全 对,这就是“精彩”部分。 如果它只能应用于打印线或其他东西,我可能会觉得更舒服。而且我认为如果有一个在每次提交后运行的单元测试基础设施,这将是非常安全的。 哦,那你可以改一下sed正则表达式 【参考方案1】:

这就是你可以用git filters 做到这一点的方式:

    创建/打开 gitattributes 文件: <project root>/.gitattributes(将提交到 repo) 或 <project root>/.git/info/attributes(不会提交到 repo) 添加一行定义要过滤的文件: *.rb filter=gitignore,即对所有 *.rb 文件运行名为 gitignore 的过滤器 在gitconfig 中定义gitignore 过滤器: $ git config --global filter.gitignore.clean "sed '/#gitignore$/d'",即删除这些行 $ git config --global filter.gitignore.smudge cat,即从 repo 拉文件时什么都不做

注意事项: 当然,这适用于 ruby​​ 文件,当行以#gitignore 结尾时应用,在~/.gitconfig 中全局应用。根据您的需要进行修改。

警告!! 这使您的工作文件与 repo 不同(当然)。任何检出或变基将意味着这些行将丢失!这个技巧可能看起来没用,因为这些行在签出、变基或拉取时会反复丢失,但我有一个特定的用例可以使用它。

只是git stash save "proj1-debug" 当过滤器处于非活动状态时(只是在gitconfig 或其他东西中暂时禁用它)。这样,我的调试代码可以随时git stash apply'd 到我的代码中,而不必担心这些行会被意外提交。

我对处理这些问题有一个可能的想法,但我会在其他时候尝试实现它。

感谢 Rudi 和 jw013 提到 git 过滤器和 gitattributes。

【讨论】:

不应该是:git config --global filter.gitignore.clean sed '/#gitignore$/d',因为您已将过滤器命名为 gitignore 我为 '.py'-files 做了这个并且 ut 工作。然后我又为'.xml'-文件做了一次。那没有用,它还破坏了以前用于 python 文件的过滤器。现在我一直收到这个错误“错误:外部过滤器sed”。你知道我该如何解决这个问题或干脆删除所有过滤器吗? 这很有趣。但它基本上就像有问题的线不存在一样。它不适用于简单地对一行进行更改这样的操作。因此,例如,您不能在函数调用中更改变量的值。例如,不要将flags = foo | bar 更改为flags = foo | bar | debug_thingy,而是必须确保在之后添加一个全新的行,例如flags |= debug_thingy 我找到了适合我的解决方案。我正在使用git config --global filter.gitignore.clean "sed 's/.*gitignore//'" 并替换像, var x = replaced #gitignore var x = 42 这样的代码。所以#gitignore后面的内容替换了行,所以#gitignore后面一定要保留缩进。 这里还有一个 sed 命令可以忽略代码块 "sed '/^# start git-block-ignore/,/^# end git-block-ignore/d;'"【参考方案2】:

我在编写 java 代码时遇到了类似的问题。我的解决方案是标记我不想提交的代码,然后添加一个预提交挂钩来查找我的标记:

#!/bin/bash
#
# This hook will look for code comments marked '//no-commit'
#    - case-insensitive
#    - dash is optional
#    - there may be a space after the //
#
noCommitCount=$(git diff --no-ext-diff --cached | egrep -i --count "(@No|\/\/\s?no[ -]?)commit")
if [ "$noCommitCount" -ne "0" ]; then
   echo "WARNING: You are attempting to commit changes which include a 'no-commit'."
   echo "Please check the following files:"
   git diff --no-ext-diff --cached --name-only -i -G"(@no|\/\/s?no-?)commit" | sed 's/^/   - /'
   echo
   echo "You can ignore this warning by running the commit command with '--no-verify'"
   exit 1
fi

【讨论】:

标记绝对比基于sed的过滤或类似的解决方案和声明性感觉不那么可怕。不错。 git-scm.com/docs/githooks#_pre_commit 如果可以的话,我会投上 100 倍的票。这是一个安全且直接的解决方案。谢谢!

以上是关于如何告诉 git 忽略个别行,即特定代码行的 gitignore [重复]的主要内容,如果未能解决你的问题,请参考以下文章

数据库单元应忽略行的顺序

如何让git忽略指定的文件

如何告诉Rubocop忽略特定的目录或文件

如何告诉 gcov 忽略不可命中的 C++ 代码行?

如何省略 SQL 中特定行的列?

如何找到特定行的行号?