Git игнорировать и удалить папку на удаленном сервере
Я знаю, что подобные вопросы задавались несколько раз, но я не могу заставить их работать в моем случае.
Где я нахожусь: у меня есть локальное репо, которое я отправляю на работающий сервер, который включает папку /content и ее подпапки. Во время производства это было нормально, так как я мог вносить изменения в /content и просто выдвигать их. Но поскольку это веб-сайт, использующий CMS, все изменения в /content теперь будут производиться удаленно.
Где я хочу быть: теперь я хочу "отсоединить" /content и его подпапки от базы кода, чтобы я мог удалить папку hefty /content локально, не удаляя ее на работающем сервере. Таким образом, я все еще смогу вносить изменения в код и отправлять их на сервер, тогда как люди могут использовать CMS для создания файлов и изменений в папке /content.
Итак, что я сделал до сих пор:
- добавил папку в.gitignore:
/content/
- удалил папку из индекса:
git rm -r --cached content/*
- попытался установить предположить, что без изменений файлы в /content не будут удалены с живого сервера:
git update-index --skip-worktree
Когда я делаю это, я, конечно, получаю:
Неустранимый: невозможно пометить файл
Поскольку файлы находятся в.gitignore, и они должны оставаться там, так что папка будет игнорироваться в будущем. Так что мне делать?
3 ответа
Обновлен, чтобы отразить исправление от OP, что обновления были сделаны на локальном клоне, а не на сервере, и что сервер представляет собой пустое хранилище с хуком, который обновляет рабочую папку черезcheckout -f
Флаги индекса (skip-worktree
или же assume-unchanged
) это не решение проблемы, а ваше понимание того, почему (что это как-то связано с .gitignore
) тоже не правильно. Скорее, эти флаги устанавливаются в записи файла в индексе; Вы не можете установить флаг для этих файлов, потому что вы удалили файлы из индекса.
Вы пояснили, что три шага, которые вы упоминаете (создать .gitignore
, бежать rm --cached
Попытка установить флаги индекса) были сделаны на локальном клоне. Поэтому следующий вопрос будет состоять в том, как синхронизировать это с сервером, не удаляя сервер content
каталог.
Индекс, как и у рабочего дерева, является локальным. Таким образом, сервер еще не знает, что вы сделали что-нибудь. В следующий раз, когда вы сделаете коммит и нажмете его, вам нужно будет предпринять шаги для правильного обновления сервера (иначе каталог содержимого будет утерян). Я рекомендую сделать это сейчас, чтобы у вас не было дополнительных изменений для жонглирования одновременно (и чтобы вы не забыли выполнить дополнительные шаги).
Вам нужно будет переключаться между локальным сервером и сервером, поэтому я хочу открыть оболочку для каждого из них.
На сервере необходимо предотвратить автоматическое обновление рабочего дерева с помощью предстоящей отправки. Поскольку репо на стороне сервера пустое и обновление происходит с помощью ловушки, отключите ловушку. (Либо переместите скрипт post-receive из каталога hooks, либо отредактируйте его и закомментируйте строки, извлекающие изменения.)
Теперь на местном уровне вам нужно организовать .gitignore
файл и зафиксируйте изменения (которые будут включать удаление (из индекса) content
каталог), и нажмите:
git add .gitignore
git commit
git push
Теперь на сервере вам нужно синхронизировать рабочее дерево и снова включить хук. Поскольку единственное изменение (кроме подавления content
папка). был файл.gitignore
git checkout --work-tree /path/to/webroot -- .gitignore
синхронизировать вещи обратно. Затем отмените все, что вы сделали, чтобы отключить крючок.
Просто чтобы прояснить концепцию gitignore сначала,
- Файл.gitignore говорит, что я не буду обнаруживать эти файлы и папки как часть системы контроля версий.
- Если файл уже является частью системы контроля версий и вы пытаетесь игнорировать его, он не будет игнорироваться.
- Вы не можете игнорировать файл, который является частью удаленного хранилища. Только когда вы удаляете его из удаленного репо и добавляете папку в gitignore, это будет игнорироваться. Примечание: в этом случае у вас не будет контента / удаленного репо.
Лучшее решение:
Пусть это будет в удаленном репозитории, а вы не будете фиксировать файлы этой папки.
Надеюсь, что это добавляет ценность к вашему вопросу
Вы не должны использовать git в качестве инструмента развертывания.
Что вы можете сделать: иметь удаленное репо без папки с контентом. Добавить папку содержимого в.gitignore. Пусть ваш живой сервер вытащит из этого удаленного репо. Это не изменит содержимое вашей папки содержимого.
Альтернатива: ваш контент находится где-то вне вашей git-папки.
Изменить: Чтобы решить вашу проблему: выполните следующие действия на пульте дистанционного управления:
git rm -r --cached content/*
git commit -m "content deleted"
затем сделайте резервную копию вашей локальной папки содержимого и git pull
,