Почему я не могу создать главную ветку? - PullRequest
0 голосов
/ 18 июня 2020

Может кто-нибудь объяснить, что я здесь делаю не так?

$ git --version
git version 2.18.2

$ git checkout master
error: pathspec 'master' did not match any file(s) known to git.

$ git branch
* (HEAD detached at origin/trunk)

$ git branch -m master
fatal: Invalid branch name: 'HEAD'

некоторый контекст: это репо было создано с использованием git svn, и я хочу переименовать ветку origin/trunk в master.

$ git branch -a
* (HEAD detached at origin/trunk)
  remotes/origin/svn-branch1
  remotes/origin/svn-branch2
  ...

1 Ответ

1 голос
/ 18 июня 2020

TL; DR

Используйте:

git checkout -b master origin/trunk

, а затем все, что вы будете делать, чтобы скопировать этот Git репозиторий в другое место. Не стесняйтесь удалить имя удаленного отслеживания origin/trunk , если вы не собираетесь выполнять дальнейший импорт SVN:

git branch -d -r origin/trunk

Вы можете повторить это для каждого имени ветки SVN, если хотите.

Длинный

Некоторые вещи, которые вам нужно знать:

  1. У вас нет ни одной ветки, 1 на данный момент:

    $ git branch
    * (HEAD detached at origin/trunk)
    
  2. У вас есть есть некоторые имена удаленного отслеживания (Git называет эти имена ветвей удаленного отслеживания , но это не имена ветвей , поэтому я предпочитаю опускать здесь слово ветка . Ваш импорт SVN создал эти:

    $ git branch -a
    * (HEAD detached at origin/trunk)
      remotes/origin/svn-branch1
      remotes/origin/svn-branch2
    

Первая строка, конечно, повторяется, но указывает на наличие remotes/origin/trunk. Дополнительное слово remotes здесь связано с тем, что полные имена каждого из них - refs/remotes/origin/<em>name</em>; Git обычно опускает как refs/, так и remotes/, за исключением git branch -a, который пропускает только refs/ в именах удаленного отслеживания (без видимой причины).

Теперь git checkout выиграл 'не создает автоматически (локальное) имя ветки, если нет ни одного совпадающего имени удаленного отслеживания. Ваш импорт SVN не создал origin/master, хотя он создал origin/trunk.

Обычно имена удаленного отслеживания существуют в вашем Git репозитории из-за имен ветки , которые существовал в каком-то другом репозитории Git. Если бы это было так, вам нужно было бы переименовать эти ветки в другом Git репозитории. Но в вашем случае другого репозитория Git нет (пока) - есть только репозиторий SVN. В репозитории SVN было имя trunk, и ваше преобразование скопировало это имя сюда.

Что вам нужно сделать, так это создать имя локальной ветки master. Самая простая команда - git checkout -b master <em>starting-point</em>, так как она также поместит вас в эту ветку (что вы, вероятно, захотите). Отправной точкой является фиксация, на которую вы хотите ссылаться этим новым именем master.


1 В этом контексте слово ветка означает название филиала . В других контекстах в Git это означает другие вещи. Филиалы Git не очень хорошо соответствуют ветвям SVN. См. Также Что именно мы подразумеваем под «ветвью»?

...