Нажатие на удаленный репозиторий из локального клона автоматически удаляет фиксации

57
6

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

# On branch master
# Changes to be committed:
# (use "git reset HEAD <file>..." to unstage)
#
# deleted: tester.c
#

Как я могу передать файл без его удаления? Почему он пытается удалить мой файл?

спросил(а) 2020-03-25T21:43:49+03:00 5 месяцев, 3 недели назад
1
Решение
69

Вы отметили, что у вас есть доступ к удаленному репозиторию.

Как только вы подключитесь к удаленному репозиторию, это ваш локальный репозиторий. Итак, у вас есть два локальных репозитория, каждый из которых смотрит на другого как иностранец. Вы разрешаете иностранцу подключаться к вашему локальному компьютеру (серверу GoDaddy) и изменять его на нем.

Когда вы это делаете, вы должны проявлять большую осторожность. По умолчанию Git будет осуществлять эту помощь для вас, используя настройку по умолчанию для receive.denyCurrentBranch. Когда вы запускаете git push с чужой машины (ваша система дома), ваш локальный компьютер (сервер) отклонит push, потому что вы используете его на своем локальном компьютере.

Вы отключили механизмы безопасности, изменив настройку метода receive.denyCurrentBranch. Затем вы разбили свою чужую машину на свою локальную (серверную) машину, как будто вы везли один автомобиль в другой для выполнения теста на краш-тест, и теперь у вас, похоже, есть файл, который пропал без вести. На самом деле это не пропало, просто, когда все безопасные средства отключены, Git ожидает, что вы заберете все гайки, болты, шины, поршни и т.д. И заново соберите их в подходящую автомобильную форму после каждого столкновения. Это боль в прикладе, поэтому не делайте этого.

В общем, сервер, получающий push, должен иметь "голый" репозиторий

Голый репозиторий - это один без дерева. Поскольку у него нет дерева, никогда не происходит столкновение.

В Git версии 2.4 и более поздних версиях вы можете установить receive.denyCurrentBranch для updateInstead. Это отменит push, если на дереве на сервере нет текущей работы. В этом конкретном случае прием Git (на сервере) обновит локальное дерево работы до вновь нажатой фиксации. Это все еще не совсем безопасно - вы можете редактировать файл и просто не записывать его обратно на дерево работы, но это удобно для автоматического развертывания. Вы все равно не должны делать разработку на сервере, потому что это может быть обновлено, пока вы не уделяете внимания, и, вероятно, лучше использовать голый репозиторий. Но теперь это возможно.

ответил(а) 2020-03-25T21:56:10.562411+03:00 5 месяцев, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема