.gitignore
可以忽略整个文件,但有没有办法在编码时忽略特定的代码行?
我经常反复在项目中添加相同的调试行,只需记住在提交之前删除它们。我想在代码中保留这些行并让git忽略它们。
答案 0 :(得分:124)
您可以使用git filters:
来实现这一目标*.rb filter=gitignore
,即在所有gitignore
个文件上运行名为*.rb
的过滤器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。
答案 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