Удаленная папка по-прежнему отображается в git bash при использовании команды ls - PullRequest
2 голосов
/ 21 марта 2020

Для проекта C# я использовал команду git rm -r --cached obj/ и git rm -r -f obj/ для удаления obj/ из каталога, но после этого, когда я использовал ls, я все еще мог видеть папку obj/ в каталоге. Когда я снова попытался использовать команду git rm -r obj/, она сказала мне fatal: pathspec 'obj/' did not match any files, но я все еще мог использовать cd obj/, чтобы увидеть все файлы, которые должны были быть удалены.

Что это значит?

Ответы [ 3 ]

1 голос
/ 21 марта 2020

git rm (без --cached) должны удалить эти файлы из рабочего дерева (вашего диска), а также из индекса, если они не были проигнорированы с самого начала.

Проверьте, если:

  • уже существует правило игнорирования

    git check-ignore -v obj/a_file_inside_obj
    
  • , если все файлы все еще там, или только несколько (которые не могут быть удалены, поскольку уже используются активным потоком)

1 голос
/ 21 марта 2020

Каждый файл, который вы используете в Git, имеет до трех одновременно активных копий. Для конкретности давайте поговорим о файле с именем obj/a (я просто предположим, был такой файл).

Существует одна копия obj/a в трех местах, когда вы начало:

  • Один из них - или может быть, в любом случае - в коммите , который вы выбрали с помощью git checkout master или git switch master, или как бы вы ни выбрали ветвь и, следовательно, фиксация.

  • Вторая копия obj/a в Git index . Индекс, также называемый промежуточной областью , содержит копию 1 каждого файла, готового к go в следующем коммите, который вы сделаете. Копия в индексе сначала помещается туда вашей командой git checkout или git switch. Он остается там до тех пор, пока вы не сделаете что-то с этим или с ним.

  • Наконец, единственная копия obj/a, которую вы можете увидеть , - это обычный файл в вашем рабочее дерево или рабочее дерево .

Причина принятой копии заключается в том, что каждая фиксация содержит копию всех из ваших файлов, как снимок фиксации. Эта копия, однажды сделанная, не может быть изменена вообще. Никакая часть любого коммита не может быть изменена: все коммиты замораживаются навсегда.

Причина копии рабочего дерева заключается в том, что зафиксированная копия не только замораживается навсегда , он также сжат в специальный Git -только формат, который может использовать только Git. Это хорошо для архивирования, но бесполезно для выполнения любой работы. Git должен извлечь его и превратить в обычный повседневный файл, чтобы вы могли его использовать. По этой же причине ваше рабочее дерево называется «рабочим деревом» или «рабочим деревом»: именно там вы выполняете свою работу.

Копия index - это та, которая не действительно есть очевидная причина для существования. Но у Git есть один. 2

Когда вы запустили:

git rm -r --cached obj/

Git удалил index копию obj/a , Переданная копия не может быть удалена : она находится в коммите, и никакая часть любого коммита не может быть изменена. Копия рабочего дерева obj/a, которую вы можете увидеть и использовать, была оставлена, потому что вы сказали Git оставить ее в покое когда вы сказали --cached. Итак, теперь у вас осталось две копии файла вместо трех.

Если вы хотите избавиться от work-tree копии файла используйте команду «удалить файл рабочего дерева» на вашем компьютере, что бы это ни было (возможно, rm). Если бы вы сказали Git ранее git rm -r obj/, вы бы указали Git удалить две копии: одну в индексе и одну в рабочем дереве. Теперь, когда индексная копия исчезла , git rm не удалит копию рабочего дерева, потому что копия рабочего дерева теперь является неотслеживаемым файлом . Так что теперь вам нужно использовать команду non-Git.

(В качестве альтернативы вы можете git add obj/a, который скопирует файл в указатель. Теперь он будет во всех снова три места, и теперь git rm obj/a удалит и индекс, и копии рабочего дерева.)


1 Технически, то, что в индексе, не является действительным скопируйте файла, а скорее имя и режим файла и ссылку на данных файла, готовых для ввода в новый коммит. Но если вы не начнете проверять содержимое индекса непосредственно с помощью git ls-files --stage или не используете git update-index для изменения содержимого индекса, разница здесь не так уж и важна.

2 То есть У Git есть копия файла, хотя см. Сноску 1. У Git тоже есть причина: для Git проще сделать Git. Существуют системы, которые работают очень похоже на Git, но не занимаются индексом. Они просто используют копию рабочего дерева в качестве предложенного следующего коммита. Это работает, но медленнее и не предлагает некоторые функции, которые Git делает.

0 голосов
/ 21 марта 2020

git rm просто удаляет файлы из git. Если вы хотите удалить файлы из файловой системы, вы должны использовать rm -rf ./obj.

...