Git - самый простой способ синхронизировать репозиторий с проверенной веткой - PullRequest
3 голосов
/ 25 октября 2010

Мой рабочий процесс в основном:

  • Создание репо на моем настольном ПК
  • Сделайте над ним какую-то работу и внесите изменения
  • Клонируйте на мой ноутбук
  • Работайте над этим, фиксируйте изменения

Теперь я хочу синхронизировать изменения с моим рабочим столом.Попытка git push desktop.local:~/my-repo не удастся, потому что главная ветвь уже извлечена .Я знаю два решения этой проблемы:

  1. Создайте третий пустой репозиторий в другом каталоге на моем ПК и оттуда обновите обе рабочие копии.Но один центральный репозиторий с двумя проверенными рабочими копиями звучит как ... SVN!За исключением более громоздкого, потому что я не могу просто использовать svn update и svn commit для синхронизации с этим центральным репозиторием - необходимы дополнительные шаги для фактического обновления центрального репо из изменений, внесенных в рабочую копию в Git.

  2. Нажмите на отдельную ветвь и объедините эту ветвь в моей рабочей копии на рабочем столе.Это не так уж плохо, но ...

... что я не понимаю, так это то, что если я просто использую SSH для настольного компьютера и выдаю git pull laptop.local:~/my-repo, этоработает!Он извлекает зафиксированные изменения и обновляет проверенную основную ветку, без вопросов.Почему git push не может сделать это сам?

Итак, вот мой вопрос: есть ли команда, которая работает так же, как ssh, - на моем настольном ПК и выдает pull?

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

Проблема в том, что когда вы пытаетесь подтолкнуть, вы делаете 2 действия одновременно. Первый - обновить git tree, а второй - обновить рабочий каталог на вашем ноутбуке. Так что в процессе push есть неявная «проверка», и git отказывается это делать, и это правильно. Представьте, что произойдет, если кто-то действительно будет работать на вашем настольном ПК. Когда вы делаете SSH, все по-другому, вы находитесь в своем рабочем каталоге, вы несете ответственность за все, что вы делаете, и поэтому можете делать все, что захотите, удаляя файл, «вытягивая». Таким образом, в некотором роде кажется, что нажатие не позволяет (по умолчанию) портить удаленный компьютер.

Обновление

Если вы устанавливаете параметр receive.denyCurrentBranch игнорировать, вы можете нажать, но вам все равно придется «синхронизировать» ваш рабочий каталог с «последней» версией кода (той, которую вы только что нажали). Это означает, что у вас еще есть две команды для запуска по одной на каждом компьютере

Если вы действительно хотите запустить только одну команду, используйте силу оболочки и создайте псевдоним, который выполняет git pull с настольного компьютера

alias remote_pull=ssh <desktop> "cd <path>; git pull"
2 голосов
/ 25 октября 2010

Вы можете установить receive.denyCurrentBranch для предупреждения, чтобы разрешить передачу на настольный ПК.Однако это опасно.Если на вашем настольном ПК есть какие-то коммиты, этот толчок вызовет путаницу.

Ниже приведено руководство для receive.denyCurrentBranch.

  receive.denyCurrentBranch
      If set to true or "refuse", receive-pack will deny a ref update to
      the currently checked out branch of a non-bare repository. Such a
      push is potentially dangerous because it brings the HEAD out of
      sync with the index and working tree. If set to "warn", print a
      warning of such a push to stderr, but allow the push to proceed. If
      set to false or "ignore", allow such pushes with no message.
      Defaults to "refuse".
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...