Я работаю над PhpStorm. Есть некоторые файлы / папки, которые я бы хотел игнорировать. Они тоже есть в удаленном хранилище. Я просто не хочу отражать какие-либо изменения в них, но они должны остаться, а не быть удалены из удаленного репо, так как я собираюсь вытащить этот репо на рабочий сервер.

  • Я добавил их в файл .gitignore, который находится в корне проекта.
  • Я добавил их в раздел Настройки PhpStorm> Контроль версий> Игнорируемые файлы, как описано здесь https://intellij-support.jetbrains.com/hc/en-us/community/posts/115000154070-How-to-gitignore-idea-files
  • Как игнорировать файлы, которые есть в репозитории? этот вопрос точно описывает мою проблему, но я попробовал оба метода, которые описаны в принятом ответе, вот что произошло:
      < Литий> git rm -r --cached .idea/ Я сделал это, и связанные с ним файлы / папки также были удалены из моего удаленного репозитория, чего я не хочу, потому что думаю, что это приведет к удалению тех, когда я подключусь к производственному серверу. < Литий> git update-index --assume-unchanged .idea/ Я сделал это, в терминале было написано «Игнорирование пути .idea /», я надеялся, что это сработает, но когда я захотел зафиксировать, я снова увидел эту папку как отслеженную.

Что я делаю не так?

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

1
Adem Tepe 19 Авг 2019 в 14:00

2 ответа

Лучший ответ

Я обнаружил, где я был неправ. Для тех, кто может нуждаться, я объясню это двумя папками, которые у меня есть:

  • config / и config.php под ним
  • pdf / и pdf.css под ним

Так:

git update-index --skip-worktree config/

Запуск этого и изменение config.php не помогли. С другой стороны:

git update-index --skip-worktree pdf/

После этого я получил вывод pdf из своего веб-приложения, и он также создал pdf.html в папке pdf /. Итак, этот новый файл был проигнорирован, хорошо.

Вскоре я пришел к выводу, что должен указать точный файл, если это то, что я хочу игнорировать, например так:

git update-index --skip-worktree config/config.php

Он игнорирует любые изменения в этом файле впоследствии.

(Я попробовал то же самое с --assume-unchanged, это сработало, но, поскольку я очень хорошо понял разницу с ответом выше, я хотел бы выделить лучший способ здесь)

0
Adem Tepe 19 Авг 2019 в 14:47

Не используйте --assume-unchanged для игнорирования отслеживаемых файлов

Цель --assume-unchanged указывает Git не проверять файлы по определенному пути на наличие изменений, поскольку они не должны изменяться .

Из документации:

установка этого бита в путь не означает, что Git проверит содержимое файла, чтобы увидеть, изменился ли он, - он заставит Git пропустить любую проверку и предположить, что он не изменился.

Эта функция существует как оптимизация производительности в случае, если в вашем репо есть очень большие файлы и / или медленная файловая система.

Как отметил Джунио С. Хамано, в ветке обсуждения о Разница между .gitignore и --assume-неизменной:

Предположим, что без изменений нельзя злоупотреблять механизмом игнорирования. Это «Я знаю, что моя файловая система работает медленно. Я обещаю Git, что я не буду менять эти пути, делая их с этим битом».

Он продолжает:

Особенно это не обещание Git, что Git всегда будет считают, что эти пути не изменены --- если Git может определить путь помеченный как предполагаемый неизменный, изменился без дополнительные lstat(2) затраты, он оставляет за собой право сообщить, что путь был изменен (в результате git commit -a может фиксировать это изменение).

Другими словами, если файл в пути, отмеченном --assume-unchanged, изменен, Git может решить игнорировать флаг, если это не слишком медленная операция. Вероятно, поэтому вы видите файлы в каталоге .idea/ как измененные.

Используйте --skip-worktree вместо

Есть еще один способ, которым вы можете сказать Git игнорировать изменения в пути, и это путем установки --skip-worktree.

Из документации:

При чтении записи, если она помечена как skip-worktree, то Git делает вид, что версия его рабочего каталога обновлена, и вместо этого читает индексную версию.

Вы можете заменить слово entry словом path . Различие между --skip-worktree и --assume-unchanged заключается в предположении , которое они создают: хотя --assume-unchanged ожидает, что файлы не будут изменены, --skip-worktree не будет заботиться о состоянии файлов в рабочем каталоге вообще.

документация гласит:

Версия рабочего каталога может присутствовать или отсутствовать. Если он присутствует, его содержимое может соответствовать версии индекса или нет.

Как только путь обозначен --skip-worktree, Git изо всех сил старается исключить любые локальные изменения, внесенные в файлы в рабочем каталоге, из истории репо.

3
Enrico Campidoglio 19 Авг 2019 в 12:08