Если я не клонирую, я не могу получить происхождение / мастер - PullRequest
0 голосов
/ 20 июня 2019

Использование git version 2.11.0.

В клонированном хранилище:

git remote show origin
* remote origin
  Fetch URL: ssh://path/to/repo
  Push  URL: ssh://path/to/repo
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

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

git remote set-url origin ssh://path/to/repo

Я получаю:

git remote show origin
* remote origin
  Fetch URL: ssh://path/to/repo
  Push  URL: ssh://path/to/repo
  HEAD branch: master

  <Remote branch missing from here>

  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (up to date)

В репо под вопросом:

Когда я git fetch, я всегда получаю сообщение:

From ssh://path/to/repo
 * branch            master     -> FETCH_HEAD

Пульт Git выглядит нормально:

$ git remote -v
origin  ssh://path/to/repo (fetch)
origin  ssh://path/to/repo (push)

Git push выглядит нормально:

$ git push -u
Branch master set up to track remote branch master from origin.
Everything up-to-date

Но --set-upstream-to терпит неудачу:

$ git branch master --set-upstream-to origin/master
error: the requested upstream branch 'origin/master' does not exist
hint: 
hint: If you are planning on basing your work on an upstream
hint: branch that already exists at the remote, you may need to
hint: run "git fetch" to retrieve it.
hint: 
hint: If you are planning to push out a new local branch that
hint: will track its remote counterpart, you may want to use
hint: "git push -u" to set the upstream config as you push.

1 Ответ

2 голосов
/ 20 июня 2019

Если вы изучите файлы конфигурации (.git/config) на предмет хорошего клона по сравнению с не очень хорошим оригиналом, вы увидите, что у одного из них - хорошего - есть запись, которая читает более или менее :

[remote "origin"]
    fetch = +refs/heads/*:refs/remotes/origin/*

Не очень хороший пропускает эту настройку fetch =.

Отсутствие параметра fetch = ... объясняет, почему git fetch в не очень хорошем хранилище никогда не создает origin/master. Он вызывает Git на origin, видит, что у другого Git есть master, и переносит любые коммиты, которые у них есть, которых у вас нет ... и затем не create origin/master потому что ничего не говорит ему сделать это. Вы видите:

 * branch            master     -> FETCH_HEAD

Напротив, в хорошем репозитории запуск git fetch вызывает Git в origin, видит, что у другого Git есть master, переносит любые коммиты, которые у них есть, которые вы не делаете ... и затем создает или обновляет origin/master в соответствии с настройкой fetch =.

Запуск git clone создает настройку извлечения. Запуск git remote add origin <em>url</em> создаст его - так что комментарий shams.kool , предлагающий удалить, а затем заново создать origin, будет работать, но запуск git remote set-url origin <em>url</em> не создаст настройки выборки.

Или вы можете просто поручить вашему Git создать эту настройку:

git config remote.origin.fetch '+refs/heads/*:refs/remotes/origin/*'
Например,

в bash (или отредактируйте файл конфигурации непосредственно в подходящем редакторе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...