Git игнорировать и удалить папку на удаленном сервере

Я знаю, что подобные вопросы задавались несколько раз, но я не могу заставить их работать в моем случае.

Где я нахожусь: у меня есть локальное репо, которое я отправляю на работающий сервер, который включает папку /content и ее подпапки. Во время производства это было нормально, так как я мог вносить изменения в /content и просто выдвигать их. Но поскольку это веб-сайт, использующий CMS, все изменения в /content теперь будут производиться удаленно.

Где я хочу быть: теперь я хочу "отсоединить" /content и его подпапки от базы кода, чтобы я мог удалить папку hefty /content локально, не удаляя ее на работающем сервере. Таким образом, я все еще смогу вносить изменения в код и отправлять их на сервер, тогда как люди могут использовать CMS для создания файлов и изменений в папке /content.

Итак, что я сделал до сих пор:

  1. добавил папку в.gitignore:

/content/

  1. удалил папку из индекса:

git rm -r --cached content/*

  1. попытался установить предположить, что без изменений файлы в /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,

Другие вопросы по тегам