我目前正在开展一项大型遗留项目,该项目经历了相当多的重构 你可以猜到这也意味着很多删除等等。
目前我已删除已成为obsolet的特定功能,因此我希望保留与删除此功能相关的更改。虽然我这样做,但我注意到一些代码可以删除,因为它没有被使用(例如未使用的类字段等)。
现在我还不想删除这些东西,因为当我想要删除该功能时,我将不得不审查每个类,以保持我的提交集中。所以我使用了一些像评论(// @REMOVE
)这样的TODO标记了不必要的代码,以便我可以在以后删除它。
现在出现了一个问题:是否可以自动化交互式添加以忽略仅包含此TODO注释的添加行,换句话说,哪些符合特定模式?我知道我可以在交互式添加的同时搜索模式但如果我不需要手动执行它会很棒。
非常感谢提前!
注意我知道Eclipse例如标记了未使用的字段等,但由于这些字段总是有一个setter并且注释为注入(它是JSF项目),所以这赢了&#39帮助我。
ANSWER
感谢RomanGotsiy的建议,我能够创建一个bash pre-commit
钩子,它完全符合我的要求。我将他的答案标记为正确,因为他指出了我正确的方向。
#!/bin/sh
#
# This pre-commit hook checks for the specified pattern and removes the matching lines from the index before commiting
# THe lines will still be included in the working tree
pattern="// @REMOVE"
function pre-commit-echo {
echo "PRE-COMMIT: $@"
}
for file in $(git diff --name-only --cached); do
# Skip if the file doesn't exist
[ -e "$file" ] || continue
index_content=$(git show :$file)
if echo "$index_content" | grep "$pattern" > /dev/null; then
pre-commit-echo "Remove lines containing \"$pattern\" from file \"$file\""
# Save working tree file content
file_content=$(cat "./$file")
# Remove the lines for the commit
{ echo "$index_content" | grep -v "$pattern"; } > "$file"
git add "$file"
# Reset the file to the old state
echo "$file_content" > "$file"
# Ensure commit isn't empty
if [ -z "$(git diff --name-only --cached)" ]; then
pre-commit-echo "Commit is empty. Abort." 1>&2
exit 1
fi
fi
done
exit 0
答案 0 :(得分:1)
您可以使用git-hooks。
我已经在python上编写了简单的钩子来解决你的问题。
#!/usr/bin/env python
import sys
import re
import os
import subprocess
OPEN_TAG = r"// @REMOVE"
END_TAG = r"// @"
def git(args):
args = ['git'] + args
git = subprocess.Popen(args, stdout = subprocess.PIPE)
details = git.stdout.read()
details = details.strip()
return details
if __name__ == '__main__':
staged_files = git(["diff", "--name-only", "--cached"])
print
print "PRE-COMMIT HOOK"
print "removing unnecessary code before commit"
for file in staged_files.split("\n"):
file_contents = open(file).read()
# remove from file unnecessary code wrapped int OPEN_TAG and END_TAG
cleared_contents, replaces_count = re.subn(r"{}(.*?){}".format(OPEN_TAG, END_TAG), "", file_contents, flags=re.S)
open(file, 'w').write(cleared_contents)
# add cleared file to stage and as result to commit
git(["add", file])
# restore original file
open(file, 'w').write(file_contents)
print(" {}: removed {} chunks".format(file, replaces_count))
print "# done"
print
要启用此挂钩,请将以下代码放入" .git / hooks / pre-commit"并允许此文件执行(Linux上为$ chmod +x pre-commit
)