Это предположение, поскольку нам действительно нужно точно знать, какая последовательность операций 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-файлов, в котором никогда не было в хранилище. Тогда извлечение разных версий вашего кода никогда не должно касаться этого каталога.