207

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

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

4

2 回答 2

173

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

  1. 创建/打开 gitattributes 文件:
    • <project root>/.gitattributes(将提交到回购)
    • <project root>/.git/info/attributes(不会提交到回购)
  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 中提取文件时什么也不做

注意:
当然,这是针对 ruby​​ 文件,当行以 结尾时#gitignore应用,全局应用在~/.gitconfig. 根据您的目的修改它。

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

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

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

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

于 2013-04-26T20:47:17.183 回答
51

我在编写 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
于 2013-12-13T19:31:10.083 回答