删除 Git 中所有“已删除”的文件

删除 Git 中所有“已删除”的文件

有没有比我当前容易出错的命令更好的解决方案来从 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 模块,我通过这种方式解决了问题。希望这会有所帮助。

相关内容