Удаляет ли команда git pull папки и файлы, находящиеся в gitignore?

Я разрабатываю сайт локально (Laravel 7), и у меня есть репозиторий на GitHub.

Каждый раз, когда я делал изменение локально, я пушил в репозиторий и с VPS, где находится сайт (через SSH), я делал git pull. Я понял, что некоторые папки, ранее помещенные в .gitignore, на самом деле не игнорировались. Затем я увидел, что можно очистить кеш git. Я сделал это таким образом, и следующий толчок фактически проигнорировал то, что я хотел, чтобы он проигнорировал:

git rm -rf --cached .
git add .
git commit -am "cleaning git cache"
git push

Теперь у меня есть ужасное сомнение. У меня, например, это в файле .gitignore

/storage
/storage/*/*

Когда я сделаю git pull на VPS, будет ли удалена папка storage, которая у меня там есть (которая полна полезных файлов, которые вообще не следует удалять)? Я не могу себе этого позволить.

EDIT: я читал противоречивые ответы. И это не успокаивает....

РЕДАКТИРОВАТЬ 2: я повторил свои шаги таким образом, и все вернулось на круги своя.

Локально: git reset HEAD~1 git add . git commit -m "Today's commit" git push -f origin master

На VPS: git pull

Ситуация восстановлена. Спасибо, в любом случае


person marco987    schedule 12.02.2021    source источник
comment
git pull не удалит эти файлы, но, поскольку они важны для вас, вы должны регулярно создавать их резервные копии.   -  person ceejayoz    schedule 12.02.2021
comment
также актуально и, возможно, дубликат: stackoverflow.com/questions/5798930/   -  person Daemon Painter    schedule 12.02.2021
comment
К сожалению, ответ на самом деле может быть. На протяжении многих лет в списке рассылки Git ведутся длительные дискуссии о том, что с этим делать. Ситуация, в которой происходят такие удаления, не очень распространена, но когда это происходит, это плохо. Если у вас есть регулярные резервные копии, это способ восстановления, если это произойдет.   -  person torek    schedule 13.02.2021
comment
Обратите внимание, что если файлы не сохраняются в Git (как и не должно быть), вам все равно нужны резервные копии. Думайте о резервных копиях как о том, что делать в случае, если машина загорится, сгорит дотла и ее придется заменить (именно поэтому резервные копии должны храниться в отдельном физическом месте).   -  person torek    schedule 13.02.2021
comment
Спасибо @torek. Могу ли я вернуться к предыдущему состоянию (предыдущий коммит)? Я так все решаю.   -  person marco987    schedule 13.02.2021
comment
Ты сможешь; посмотрите как git revert, так и git reset, и обратите внимание, что они делают разные вещи: вам нужно решить, хотите ли вы (и это нормально) удалить историю или просто добавить новую историю, которая восстанавливает предыдущее состояние. Тем не менее, вероятно, лучше не хранить в Git те вещи, которые не должны храниться в Git, и делать регулярные резервные копии.   -  person torek    schedule 13.02.2021
comment
Скажем так, меня не волнует, что от этого бардака остались какие-то следы! ???? Главное, что я возвращаюсь в прежнее состояние. Например, могу ли я это сделать? git reset --soft HEAD~1   -  person marco987    schedule 13.02.2021
comment
ваш вопрос был удаляет ли он, и ответ может быть. Некоторые из них хорошие ответы, другие менее. Но ваш вопрос должен был заключаться в том, как мне это решить? Потому что, видимо, вас это интересует.   -  person Daemon Painter    schedule 15.02.2021


Ответы (5)


С такой последовательностью команд? Файлы будут удалены, потому что ветка, которую вы объединяете, избавляется от них. Конечно, когда файлы были удалены, человек, который это сделал, говорит git эй, оставьте файлы в моем рабочем деревеgit rm --cached), но когда предпринимается попытка слияния этой ревизии с другим репозиторием (скажем, с вытягиванием), git не сможет узнать, что файлы должны были храниться в рабочем дереве, и поэтому они исчезнут.

person eftshift0    schedule 12.02.2021
comment
две ветви — это локальная ветвь VPS и удаленная ветвь GitHub, которую отслеживает локальная ветвь VPS. - person Daemon Painter; 12.02.2021

Команда git pull удалит любой файл или папку, которые были удалены восходящими фиксациями. То есть, если ваши коллеги удалили какие-то файлы, то они будут удалены и в вашей локальной копии. Неважно, находятся ли эти файлы в .gitignore.

В любом случае, не стоит паниковать. Если вы не удалите историю, эти файлы можно будет восстановить. Я предполагаю, что версии этих файлов были в вашем репозитории git.

Тем не менее, если вы удалите историю, с помощью команды git reflog вы можете восстановить старые коммиты, которых больше не существует (если не был активен сборщик мусора).

person carnicer    schedule 12.02.2021
comment
предполагая, что содержимое этих файлов никогда не обновляется в рабочей копии VPS, которая, по-видимому, не отправляет и не фиксирует, и может быть содержимым, созданным пользователями веб-сайта и так далее и тому подобное. - person Daemon Painter; 12.02.2021
comment
Пожалуйста, помогите мне понять это лучше? Я младший разработчик - person marco987; 13.02.2021
comment
Изучение git требует времени. Мне нужна была практика, чтобы привыкнуть к ветвлению, слиянию и удалению. Возможно, вы захотите попрактиковаться во всех этих командах с помощью некоторых руководств и некоторых фиктивных репозиториев. Я только что узнал, что существует проект под названием gitless, который, кажется, обеспечивает более простой пользовательский интерфейс по сравнению с git, но при этом совместим с ним. - person carnicer; 16.02.2021

Я делал такие вещи много раз особенно в последнее время. Никогда ничего не удалялось.

Этот

git rm -rf --cached .
git add .
git commit -am "cleaning git cache"
git push

Удаляет файлы только из git index.

person IVN    schedule 12.02.2021

Нет, файлы не будут удалены с помощью git pull.

Если вы сделаете это:

 git reset --hard origin/master;

тогда да, каталог будет установлен такой же, как в репозитории, и каталог хранилища будет очищен.

Но, пожалуйста, сделайте резервную копию. У вас не должно быть каталога, который вы не можете позволить себе потерять.

person JoseLinares    schedule 12.02.2021
comment
хорошо, если я зафиксирую удаление файла, файл будет удален при следующем извлечении git... Вы можете проверить это, переместив файл в папку и зафиксировав операцию. Следует фиксировать как удаление, так и добавление нового файла. - person Daemon Painter; 12.02.2021

TLDR; да, вы собираетесь удалить контент, который вы только что удалили, когда вы git pull с VPS.


Давайте проанализируем ситуацию здесь.

Каждый раз, когда я делал локальное изменение, я пушил в репозиторий и с VPS, где находится сайт (через SSH), делал git pull.

Таким образом, это происходит тремя способами: GitHub — это ваш центральный репозиторий, вы разрабатываете локально, создаете резервную копию удаленно на GitHub для распространения и загружаете с VPS для развертывания веб-сайта.

Я понял, что некоторые папки, ранее помещенные в .gitignore, на самом деле не игнорировались.

Это нормальное и хорошо задокументированное поведение. Если файлы уже были добавлены и зафиксированы до их появления в .gitignore, они продолжат отслеживаться. Также обратите внимание, что на VPS команда git pull не удалит эти файлы, а просто продолжит их игнорировать.

Затем я увидел, что можно очистить кеш git. Я сделал это таким образом, и следующий толчок фактически проигнорировал то, что я хотел, чтобы он проигнорировал:

git rm -rf --cached .
git add .
git commit -am "cleaning git cache"
git push

Теперь вы создали фиксацию, чтобы специально удалить эти файлы и прекратить их отслеживание, поскольку они добавлены в -gitignore. С этого момента, если вы поместите файл, соответствующий параметрам игнорирования, в рабочую папку, он будет игнорироваться. Не удалено, просто не упомянуто для контроля версий.

У меня, например, это в файле .gitignore

/storage
/storage/*/*

Когда я выполню git pull на VPS, будет ли удалена папка хранения, которая у меня есть (которая полна полезных файлов, которые вообще не следует удалять)?

Следует отметить, что, поскольку /storage содержит /storage/*/*, вторая строка в вашем .gitignore избыточна. Но увы. Вернемся к делу: содержимое .gitignore не имеет значения. Как мы уже знаем, эти файлы будут проигнорированы.

Однако следует сделать оговорки:

  1. Если вы зафиксировали удаление этих файлов, то эти файлы будут удалены (похоже, что вы это сделали).
  2. Если вы заново клонируете репозиторий на VPS, то есть если вы очищаете свой текущий веб-сайт и git clone из GitHub, вы, вероятно, никогда не получите содержимое storage таким образом.
  3. Мне кажется, вы не хотите ставить storage под контроль версий, а ведь данные для вас важны. Создайте резервную копию в другом месте.

Дело не в .gitignore в вашем случае, а в том, что вы явно зафиксировали удаление этих файлов.

Теперь позвольте мне предположить, что содержимое storage обновляется только на VPS и никогда не фиксируется и не отправляется на GitHub. Дополнительные предостережения:

  1. git не знает об этом содержимом
  2. Если вы удалите его, он исчезнет навсегда, с точки зрения git
  3. Если вы оказались в такой ситуации из-за того, что контент уже был зафиксирован один раз, и он никогда не меняется, и я прав в обоих предположениях, вы сможете найти его в ваша история репозитория в предыдущем коммите. Но это немного выходит за рамки ответа.

Внимательно прочитав другие ответы, я хотел бы связать документы (выделено мной ):

Удалите файлы, соответствующие спецификации пути, из индекса или из рабочего дерева и индекса. git rm не удалит файл только из вашего рабочего каталога. (Нет возможности удалить файл только из рабочего дерева и при этом сохранить его в индексе; используйте /bin/rm, если вы хотите это сделать.)

И вы поставили это в очередь с recursive, force и cached:

Используйте этот параметр, чтобы отменить подготовку и удалить пути только из индекса. Файлы рабочего дерева, независимо от того, изменены они или нет, останутся нетронутыми.

Но вы отменяете проверку актуальности с помощью force.

person Daemon Painter    schedule 12.02.2021
comment
Прямо сейчас ваш ответ, безусловно, самый красноречивый. Но я не понял. Вернее, я понял некоторые шаги, но не понял, как применить это к моему случаю. ???? - person marco987; 13.02.2021
comment
@ marco987 тогда непременно: я человек, задавайте вопросы, и я буду рад разъяснить. Я не пишу бумаги ради этого. - person Daemon Painter; 15.02.2021