Есть ли лучшее решение для удаления удаленных вручную файлов из репозитория Git, чем моя текущая подверженная ошибкам команда?
git status | grep deleted: | cut -d: -f2 | xargs git rm
Я думаю, что вы просите удалить файлы из индекса, которые были удалены из рабочего дерева. Команда git add -u
сделает это, в дополнение к добавлению любых изменений в рабочем дереве (но не новых файлов).
Чтобы сделать более точно то, что вы просили, man-страница git-rm(1)
рекомендует следующее, что по сути то же самое, что и ваше решение, но гораздо менее хрупкое.
Если все, что вы действительно хотите сделать, - это удалить из индекса файлы, которых больше нет в рабочем дереве (возможно, из-за того, что ваше рабочее дерево загрязнено и вы не можете использовать git commit -a), используйте следующую команду:
git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
Привет, я укажу вам на мой скрипт 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_file. Затем я использую $ 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, где я решил проблему таким образом. надеюсь, что это помогло.