Это своего рода предположение, так как нам действительно нужно точно знать, какая последовательность операций 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