Папка из одной ветви, добавленная в мой .gitignore, существует, когда я переключаюсь на другую ветку - PullRequest
0 голосов
/ 17 января 2019

Я работаю над двумя ветвями: ветвь A и ветвь B. Содержимое каждой ветки выглядит следующим образом:

**branch A** |-parent |-folder1 |-folder2

**branch B** |-parent |-folder3 |-some_folder |-some_other_stuff |-more_stuff

Я добавил "some_folder" в .gitignore. Новые файлы создаются и добавляются в «some_folder» во время работы над веткой B, следовательно, изменяя ее. Несмотря на то, что он должен игнорироваться, а состояние git вообще не отображает список папок (как и должно быть), когда я переключаюсь на ветку A, папка 3 теперь отображается в списке, когда я выполняю ls вместе с «some_folder», но когда я выполняю git Статус говорит, что мое рабочее дерево чистое. Мое рабочее дерево в ветке А теперь выглядит так:

|-parent |-folder1 |-folder2 |-folder3 |-some_folder

Разве папка 3 и "some_folder" не должны содержаться в ветви B и не переноситься при переключении на другую мою ветку?

1 Ответ

0 голосов
/ 17 января 2019

TL; DR

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

Long

Git мало заботится о папках. Git заботится о файлах . 1 Файл имеет путь, например dir1/dir2/file.ext. Операционная система заботится о папках (каталогах) и, следовательно, для существования file.ext Git должен создать dir1, а затем dir1/dir2, если они еще не существуют. Создав эти каталоги, Git теперь может создавать file.ext во втором - и это all , о которых Git заботится, на git checkout: те файлы, которые в коммите извлекаются извлекается как в Git index , 2 , так и в work-tree .

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

Когда вы переключаетесь с коммита a123456... (на кончике BranchA) на коммит b789abc... (на кончике BranchB), Git будет:

  • удалить из индекса и рабочего дерева все файлы, которые есть только в a123456
  • создавать в индексе и рабочем дереве любые файлы, которые есть только в b789abc
  • заменить в индексе и рабочем дереве все файлы, которые в b789abc отличаются от файлов в a123456.

Шаги remove и create иногда позволяют Git удалить пустой каталог или требуют, чтобы Git создал новый каталог. Шаги replace , как правило, не связаны с манипулированием каталогами. 3

Если у вас есть файлы, которые Git не хранит в своем индексе, это неотслеживаемых файлов. Они существуют в рабочем дереве, но их нет в индексе, поэтому они в основном не имеют отношения к Git. Пока переключение с коммита a123456 (на кончике BranchA) на b789abc (на кончике BranchB) не требует, чтобы Git что-то делал с этими файлами - т.е. до тех пор, пока они не находятся в b789abc либо - Git ничего не делает с этими файлами. Ничего не делая с файлами, Git также ничего не делает с содержащимися в них каталогами.


1 Это либо слишком слабо, либо слишком сильно. Git действительно заботится о коммитах . Однако коммит содержит файлов: полный и полный снимок каждого файла в том состоянии, в котором он находился на момент этого коммита. Точнее, каждый коммит содержит файлы, которые он содержит, но это отчасти очевидно и бесполезно. Действительно, он содержит файлов, которые были в индексе, когда тот, кто сделал коммит, сделал коммит. Именно поэтому индекс (см. Сноску 2) так важен.

2 Индекс также иногда называют промежуточной областью или кеш , в зависимости от того, кто / какая часть Git выполняет вызов. Индекс начинается с копии каждого файла из текущего коммита, готового перейти в следующий коммит. Использование git add копирует новые файлы или новые версии существующих файлов в индекс, делая их готовыми к фиксации. Следовательно, лучшее краткое описание индекса таково: Индекс - это набор файлов, которые войдут в следующий коммит. Это не охватывает все мелкие подробности, особенно то, как работает индекс во время слияний, но охватывает самую важную часть.

3 Есть редкий случай, когда по какой-то причине вы удалили кучу файлов рабочего дерева, которые равны в индексе из a123456, и вы ' мы также забрали их каталог дерева работ. В этом случае Git просто заново создаст каталог, чтобы удовлетворить принуждение ОС иметь каталог для хранения файла (ов). Git не нуждается или не заботится о каталоге - Git нужен только файл в индексе, но вам , вероятно, нужен файл, поэтому Git создает каталог при необходимости, так же, как и для файлов, которые не было в a123456.

...