Запретить git удаление локального каталога, который находится в git, игнорировать при начальной настройке git - PullRequest
1 голос
/ 03 марта 2020

У меня есть проект WordPress, в котором я хочу настроить git на сервере. Я также хочу добавить каталог wp-content / plugins в .gitignore, чтобы он не изменялся во время установки git. Но когда я сделал это на своем локальном компьютере, папка плагинов удаляется.

Я пробовал это

  1. Сброс мастера до первоначального коммита, чтобы получить папку и содержимое плагинов и в которых нет плагинов в gitignore

  2. git rm --cached -r wp-content / plugins /

  3. git pull для получения коммита, который удалил папку с плагинами и поместил плагины в gitignore.

Но он все равно удаляет папку плагинов.

Как запретить git удалять плагины и папку загрузки? Папка с плагинами также не должна находиться в главной ветке

1 Ответ

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

Как запретить 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 мог бы хранить и управлять пустыми папками, не прибегая к «использованию пустого подмодуля» обмануть.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...