有没有比我当前容易出错的命令更好的解决方案来从 Git 存储库中删除手动删除的文件?
git status | grep deleted: | cut -d: -f2 | xargs git rm
答案1
我认为您要求从索引中删除已从工作树中删除的文件。该命令git add -u
将执行此操作,此外还会在工作树中添加任何更改(但不会添加新文件)。
为了更准确地完成您的要求,git-rm(1)
手册页推荐以下内容,它与您的解决方案基本相同,但不那么脆弱。
如果您真正想要做的是从索引中删除工作树中不再存在的文件(可能是因为您的工作树很脏,所以您无法使用 git commit -a),请使用以下命令:
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
答案2
你好,我会向你介绍我的脚本 etckeeper-ng,我在其中解决了同样的问题
https://github.com/tuxlover/etckeeper-ng/blob/master/modules/backup_git.sh
我将简要描述如何做得更好:
首先创建一个可以解析的辅助文件。
git_status_file=/tmp/git_status_file
git status -s > $git_status_file
在这种情况下,git_status_file 变量设置为/tmp/git_status_文件接下来我要做的是使用 $git_status_file 作为 while 循环中的输入:
while read line
do
if [ $(echo $line |awk '{print $1}') == "D" 2> /dev/null ]
then
# git uses "" to denote files with spaces in their names
# and does not use "" when the name has no spaces
# so we must distinguish these two cases
del_file=$(echo $line |awk -F\" '{print $2}'|| echo "no")
del_file_S=$(echo $line | awk '{print $2}')
# ensures that del_file is a full string
del_file="${del_file[*]}"
# delete the file, ${del_file:0} expands to the full file name
# this is important for files with blanks in their names
git rm "${del_file:0}" 2> /dev/null|| git rm $del_file_S 2> /dev/null
# this line does only work on non-possix shells
done < <($git_status_file)
这实际上适用于我的 etckeeper-ng 模块,我通过这种方式解决了问题。希望这会有所帮助。