如何告诉 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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章