5

Есть ли лучшее решение для удаления удаленных вручную файлов из репозитория Git, чем моя текущая подверженная ошибкам команда?

git status | grep deleted: | cut -d: -f2 | xargs git rm

2 ответа2

5

Я думаю, что вы просите удалить файлы из индекса, которые были удалены из рабочего дерева. Команда git add -u сделает это, в дополнение к добавлению любых изменений в рабочем дереве (но не новых файлов).

Чтобы сделать более точно то, что вы просили, man-страница git-rm(1) рекомендует следующее, что по сути то же самое, что и ваше решение, но гораздо менее хрупкое.

Если все, что вы действительно хотите сделать, - это удалить из индекса файлы, которых больше нет в рабочем дереве (возможно, из-за того, что ваше рабочее дерево загрязнено и вы не можете использовать git commit -a), используйте следующую команду:

git diff --name-only --diff-filter=D -z | xargs -0 git rm --cached
0

Привет, я укажу вам на мой скрипт 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, где я решил проблему таким образом. надеюсь, что это помогло.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .