использование git на рабочем сервере

У меня есть веб-приложение php, которое должно генерировать некоторые файлы PDF в указанной папке. На рабочем сервере я также использую git, и проблема в том, что некоторые файлы PDF время от времени исчезают. В .gitignore я добавил папку pdf и *.pdf

Есть ли шансы, что git удалит мои файлы *.pdf?


person dole doug    schedule 20.09.2011    source источник
comment
Раньше эти PDF-файлы отслеживались в репозитории? Вы переключаетесь между старой и новой версиями кода на рабочем сервере?   -  person Mark Longair    schedule 20.09.2011
comment
да, до определенного момента времени файлы PDF также отслеживались git.   -  person dole doug    schedule 20.09.2011


Ответы (2)


Это своего рода предположение, так как нам действительно нужно точно знать, какая последовательность операций git вызвала удаление файлов, чтобы быть уверенным. Тем не менее, ключевой момент, который нужно понять (и который часто неправильно понимают), заключается в том, что механизм игнорирования git предназначен для файлов, которые являются «одноразовыми», такими как продукты сборки. Он не предназначен для ценных файлов, которые вы не хотите хранить в репозитории. (В качестве ссылки на эти утверждения это обсуждается в эти письма в списке рассылки git.)

Чтобы привести пример сценария для описанной вами ситуации, предположим, что в версии a1b2c3 в репозитории были зафиксированы следующие файлы:

pdfs/0001.pdf
pdfs/0002.pdf

На каком-то более позднем этапе истории (скажем, на вашем текущем master) вы удалили все отслеживаемые PDF-файлы с git rm -rf и добавили каталог pdfs в .gitignore. Однако ваше веб-приложение по-прежнему создает PDF-файлы и помещает их в подкаталог pdfs, и теперь у вас есть следующие игнорируемые файлы:

pdfs/0001.pdf
pdfs/0002.pdf
pdfs/0003.pdf
pdfs/0004.pdf

Что теперь может случиться, так это то, что если вы решите проверить старую версию кода с:

git checkout a1b2c3

... git увидит, что он хочет обновить pdfs/0001.pdf и pdfs/0002.pdf из этой версии, и, поскольку эти пути в настоящее время игнорируются, он решит, что их можно перезаписать молча. (В конце концов, это то, что вы хотели бы сделать со сборочными продуктами.)

Затем, когда вы вернетесь к master, с:

git checkout master

... git (вполне разумно) считает, что можно удалить все эти два PDF-файла, поскольку они были удалены из репозитория в отношении a1b2c3. Итак, вам остается только:

pdfs/0003.pdf
pdfs/0004.pdf

... и исходные игнорированные pdfs/0001.pdf и pdfs/0002.pdf, созданные вашим приложением, исчезли.

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

Практическое решение, которое я бы предложил, — это создать новый каталог для PDF-файлов, которых никогда не было в репозитории. Тогда проверка различных версий вашего кода никогда не должна касаться этого каталога.

person Mark Longair    schedule 20.09.2011

Прежде всего, я не понимаю, почему документы PDF помещаются в исходное дерево. Если бы я был там, где вы, я бы всегда хранил загруженные материалы в другой папке, чем исходный код вашего приложения.

Во-вторых, я не думаю, что Git скрывает от вас ваши PDF-файлы. Конечно, нет, если ваш .gitignore настроен так, как вы говорите. Я боюсь, что какой-то другой процесс мешает вашим PDF-файлам.

Помимо того, что Git, вероятно, не вызывает этого, я рекомендую следующее.

  1. ваше приложение хранит загруженные материалы вне папок с исходным кодом самого приложения.
  2. Не делайте коммиты на сервере (я не знаю, делаете ли вы это, но если исправить что-то в реальной среде является обычной практикой, я могу себе представить, что что-то пойдет не так). На живом сервере вы должны только тянуть код и больше ничего не делать.
person hoppa    schedule 20.09.2011