.gitignore
可以忽略整个文件,但是有没有办法在编码时忽略特定的代码行?
我经常在项目中反复添加相同的调试行,只是必须记住在提交之前删除它们。我只想保留代码中的行并让 git 忽略它们。
这就是你可以用git 过滤器做到这一点的方式:
<project root>/.gitattributes
(将提交到回购)<project root>/.git/info/attributes
(不会提交到回购)*.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。
我在编写 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