.gitignore可以忽略整个文件,但是否有一种方法可以在编码时忽略特定的代码行?
我经常反复地在项目中添加相同的调试行,但在提交之前必须记得删除它们。我想保留代码中的行,让git忽略它们。
.gitignore可以忽略整个文件,但是否有一种方法可以在编码时忽略特定的代码行?
我经常反复地在项目中添加相同的调试行,但在提交之前必须记得删除它们。我想保留代码中的行,让git忽略它们。
这是你可以用git过滤器做的事情:
Create/Open gitattributes file: <project root>/.gitattributes (will be committed into repo) OR <project root>/.git/info/attributes (won't be committed into repo) Add a line defining the files to be filtered: *.rb filter=gitignore, i.e. run filter named gitignore on all *.rb files Define the gitignore filter in your gitconfig: $ git config --global filter.gitignore.clean "sed '/#gitignore$/d'", i.e. delete these lines $ git config --global filter.gitignore.smudge cat, i.e. do nothing when pulling file from repo
注: 当然,这是针对ruby文件的,当一行以#gitignore结尾时应用,在~/.gitconfig中全局应用。根据您的目的,对其进行修改。
警告! ! 这使得您的工作文件不同于回购(当然)。任何检出或重基将意味着这些行将丢失!这个技巧可能看起来毫无用处,因为这些行在签出、变基或拉取时会反复丢失,但是为了利用它,我有一个特定的用例。
当过滤器处于非活动状态时,git只保存“proj1-debug”(只是在gitconfig中暂时禁用它)。这样,我的调试代码可以随时应用到我的代码中,而不用担心这些行被意外提交。
对于处理这些问题,我有一个可能的想法,但我将在其他时间尝试实施它。
感谢Rudi和jw013提到git过滤器和git属性。
我在编写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