如何告诉git忽略单独的行,即特定代码行的gitignore

时间:2013-04-26 20:47:17

标签: git gitignore ignore

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

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

2 个答案:

答案 0 :(得分:124)

您可以使用git filters

来实现这一目标
  1. 创建/打开gitattributes文件:
    • < project root> / .gitattributes(将被提交到repo)
      OR
    • < project root> / .git / info / attributes(不会被提交到repo中)
  2. 添加一行定义要过滤的文件:
    • *.rb filter=gitignore,即在所有gitignore个文件上运行名为*.rb的过滤器
  3. gitignore中定义gitconfig过滤器:
    • $ git config --global filter.gitignore.clean "sed '/#gitignore$/'d",即删除这些行
    • $ git config --global filter.gitignore.smudge cat,即从repo中提取文件时不执行任何操作
  4. 注意:
    当然,这是针对ruby文件,当行以#gitignore结尾时应用,在~/.gitconfig中全局应用。根据您的需要对此进行修改。

    警告!
    这使您的工作文件与repo(当然)不同。任何退房或重新定位都意味着这些线路将会丢失!这个技巧似乎没用,因为这些行在签出,重新绑定或拉取时反复丢失,但我有一个特定的用例才能使用它。

    过滤器处于非活动状态时只需git stash save "proj1-debug" (只是在gitconfig或其他内容暂时禁用它)。通过这种方式,我的调试代码可以随时git stash apply添加到我的代码中,而不必担心这些行会被意外提交。

    我有可能处理这些问题,但我会尝试在其他时间实施它。

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

答案 1 :(得分:20)

我在撰写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