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

У меня есть следующая структура репозитория:  
<i>.git<br/>
.gitignore<br/>
public_html/<br/>
--.git<br/>
--папкиСайта<br/>
--файлыСайта</i>  

Я использую облегчённую версию репозитория, коммитя только изменённые файлы, и всегда работал по SFTP без проблем. Однако теперь, когда я решил переходить на локальный сервер, возникла проблема: команда `git status` показывает множество неотслеживаемых файлов в папке public_html/. Я планирую добавить их в .gitignore, но не могу использовать команду `git clean -f`, так как это приведёт к их удалению в корневом репозитории. 

Кроме того, я не могу применить git submodule, subtree или worktree, поскольку для их использования потребуется создать отдельные папки. Закоммитить все файлы сайта — это один из возможных вариантов, к которому я уже склоняюсь, но это не идеальное решение. Если в будущем я решу обновить свой локальный репозиторий из боевого сайта через бэкап, мне снова придётся чистить лишние файлы, наделанные администратором, или добавлять их в .gitignore.

Могу я получить универсальное решение, которое позволило бы безболезненно работать как локально, так и через SFTP, а также задеплоить изменения на боевой сервер? Или я снова создал себе лишние сложности?
  • 4 сентября 2024 г. 14:03
Ответы на вопрос 2
Ваша ситуация действительно непростая, но есть несколько подходов, которые могут помочь вам решить проблему с игнорированием файлов в подпапке `public_html/` и одновременно не потерять управление над этими файлами в вашем репозитории. Рассмотрим возможные варианты:

### 1. Использование `.gitignore`

Вы можете добавить необходимые паттерны в файл `.gitignore`, чтобы игнорировать неотслеживаемые файлы в папке `public_html/`, но сначала вам нужно удалить их из индекса Git (не удаляя с диска). Для этого выполните команду:

```bash
git rm -r --cached public_html/*
```

Эта команда уберёт все файлы из индекса, но они останутся на диске. Далее добавьте в `.gitignore` нужные паттерны. Например:

```
/public_html/*
!/public_html/файлыКоторыеНужны
```

Теперь Git будет игнорировать все файлы в `public_html/`, кроме тех, которые вы явно указали.

### 2. Использование `assume-unchanged`

Если у вас есть конкретные файлы, которые вам нужно игнорировать, но они уже были закоммичены, вы можете использовать команду `git update-index --assume-unchanged`. Это не идеальный способ, так как он не предотвращает их отображение в статусе при `git status`, но может помочь в некоторых случаях.

Например:

```bash
git update-index --assume-unchanged public_html/файл
```

Для отмены действия используйте:

```bash
git update-index --no-assume-unchanged public_html/файл
```

### 3. Работа с отдельным клонов (Local Clone)

Как вариант, вы можете сделать отдельный клон вашего репозитория для работы с SFTP и игнорирования изменений. В этом клоне вы можете настроить `.gitignore` так, как это необходимо для сайта. Это позволит вам сохранить основной репозиторий чистым и без лишних файлов.

### 4. Поддержка структуры с использованием `git clean`

Если вы хотите очищать временные или не нужные файлы, но не хотите удалять файлы вищанних репозиториях, используйте `git clean -n` для проверки, какие файлы будут удалены, а затем `git clean -f` для удаления, если это подходит. Это можно делать только с файлам, которые точно не нужны в `public_html/`.

### 5. Уточнение процесса деплоя

Обеспечьте, чтобы ваш процесс деплоя (например, в боевой среде) направлял только необходимые файлы на сервер. Это может потребовать настройки вашего инструмента для деплоя (например, rsync, scp и т.д.), чтобы исключить лишние файлы.

### Заключение

К сожалению, универсальное решение в Git для такой специфической структуры может оказаться сложным, но приведенные выше методы должны помочь вам организовать работу с файлами. Используйте комбинацию `gitignore`, `assume-unchanged`, создания отдельного клона репозитория и тщательного деплоя, чтобы достичь идеального баланса между локальной и удаленной работой.
Чтобы игнорировать содержимое вложенного репозитория, ничего делать не нужно — Git уже всё за вас придумал. Он автоматически игнорирует рабочий каталог, в котором находится .git .
Похожие вопросы