Как запретить git удалять [эти] папки [ы]?
Поместить в них несколько файлов.
Что происходит здесь
Git на самом деле не интересует каталоги / папки (вы называли их сначала каталогами, а потом папками, поэтому я использую оба термина здесь). Git интересуется и хранит файлов . Что касается Git, то файлы имеют - или могут иметь - имена long-i sh с частями, которые ваша OS настаивает на обработке в папке-i sh. Например, Git может хранить файл с именем wp-content/plugins/file.ext
. Ваша ОС требует, чтобы это было сохранено как файл с именем file.ext
в папке с именем plugins
в папке с именем wp-content
. Это проблема вашей ОС, а не Git, но она становится проблемой Git в тот момент, когда Git переходит к извлекать файл с именем wp-content/plugins/file.ext
из некоторого коммита, в обычный файл на ваш компьютер.
В этот момент Git создаст wp-content
, если необходимо, затем создаст wp-content/plugins
, если необходимо, чтобы он мог создать файл, равный Git, называется wp-content/plugins/file.ext
. Git не не хранил этих папок нигде. Он сохранил файл wp-content/plugins/file.ext
(в коммите), а затем вы сказали ему: "возьмите этот коммит и сделайте его доступным для меня", чтобы он создал эти два каталога, потому что ваша ОС настаивает на этой структуре папок и файлов.
Поскольку ОС настаивает, Git будет создавать каталогов / папок по требованию. Точно так же, когда Git удаляет файл commit - поскольку вы переключаетесь с этого коммита, на другой коммит, в котором отсутствует , этот файл - Git будет очищать удаляет каталог / папку, если это последний файл, который заставляет Git разместить ОС, если этот каталог / папка существует.
Git не может и, следовательно, не удалит каталог / папку, если в каталоге существует какой-либо другой подкаталог / папка или какой-либо файл. Например, если у вас есть неотслеживаемые файлы, например, Git не будет касаться каталога.
Обратите внимание, что git clean -df
удалит пустые каталоги из рабочего дерева, Git создал их или нет. Это все из-за того, что Git не хранит информацию о каталогах / папках в своем index . Индекс - это то, из чего Git строит новые коммиты. Индекс очень важен для Git: именно там действительно происходят слияния; это где новые коммиты строятся; и он кэширует информацию о извлеченном коммите, чтобы Git работал быстро.
В общем, между одной командой Git и следующей, Git не помнит ни одной каталоги, которые он создал. Все, что он делает:
- удаляет файлы коммита из индекса, и если вы сказали ему обновить ваше рабочее дерево, удалите те же самые файлы из рабочего дерева; и
- загрузите коммит в индекс, и если вы сказали ему обновить свое рабочее дерево, замените эти файлы на их фиксированные (и теперь индексные копии) версии.
Поскольку индекс не отслеживает каталоги - только файлы , с длинными именами, такими как wp-content/plugins/file.ext
- Git, буквально не может хранить пустую папку. 1 Вот почему он использует этот трюк «создать при необходимости, удалить при удалении последнего файла».
Поскольку Git использует «удалить папку рабочего дерева при удалении последнего файла», останавливает Git удаление такой директории / папки только для того, чтобы оставить в ней какой-то файл. Это может быть совершенный файл, такой как пустой .gitignore
или пустой .keep
или что угодно, или просто какой-нибудь неотслеживаемый файл. Если это какой-то неотслеживаемый файл, Git сам по себе не будет создавать каталог, либо: вам придется это сделать.
См. Ссылку на сноску, чтобы узнать, как использовать пустой подмодуль вместо манекена .gitignore
, но я отмечу, что если бы я делал это, я бы просто использовал манекен .gitignore
(вероятно, не пустой, а точнее один с одной строкой *
).
1 Однако он может хранить субмодуль через gitlink и gitlink могут указывать на хранилище, в котором нет файлов. Следовательно, пустой подмодуль действительно действительно работает для хранения пустого каталога! Обидно, что индекс не может хранить каталог режима 40000
, потому что если бы он мог, Git мог бы хранить и управлять пустыми папками, не прибегая к «использованию пустого подмодуля» обмануть.