Git игнорировать и удалить папку на удаленном сервере - PullRequest
0 голосов
/ 23 мая 2018

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

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

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

Итак, что я сделалдалеко:

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

/content/

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

git rm -r --cached content/*

попытался установить предположения без изменений, чтобы при загрузке файлы в / content не удалялись с живого сервера:

git update-index --skip-worktree

Когда я это делаюЯ, конечно, получаю:

fatal: Невозможно пометить файл

Поскольку файлы находятся в .gitignore, и они должны оставаться там, так что папкабудет игнорироваться в будущем.Так что мне делать?

Ответы [ 3 ]

0 голосов
/ 23 мая 2018

Вы не должны использовать git в качестве инструмента развертывания.

Что вы можете сделать: иметь удаленное хранилище без папки содержимого.Добавить папку содержимого в .gitignore.Пусть ваш живой сервер вытащит из этого удаленного репо.Это не изменит содержимое вашей папки с контентом.

Альтернатива: разместите ваш контент где-нибудь за пределами вашей папки git.

Редактируйте : Чтобы решить вашу проблему: выполнитедалее на remote :

git rm -r --cached content/*
git commit -m "content deleted"

затем сделайте резервную копию вашей локальной папки содержимого и git pull.

0 голосов
/ 23 мая 2018

Обновлен, чтобы отразить исправление от 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

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

0 голосов
/ 23 мая 2018

Просто чтобы прояснить концепцию gitignore, файл

  • .gitignore говорит, что я не буду обнаруживать эти файлы и папки как часть системы контроля версий.
  • Если файл уже является частью системы управления версиями и вы пытаетесь игнорировать его, он не будет игнорироваться.
  • Нельзя игнорировать файл, являющийся частью удаленного репозитория.Только когда вы удаляете его из удаленного репо и добавляете папку в gitignore, это будет игнорироваться.Примечание: в этом случае вы не будете иметь контент / на удаленном репо.

Лучшее решение:

Пусть это будет в удаленном хранилище, и вы не будете фиксировать файлы этой папки.

Надеюсь, это добавит ценность вашему вопросу

...