Git: трудности с получением существующего репозитория Git для отслеживания нового удаленного репозитория

Резюме: Мне трудно получить существующий локальный репозиторий для отслеживания нового удаленного репозитория.

Что я пробовал: я попытался переместить свое локальное репо в новое голое репо при настройке восходящего отслеживания. Git сообщает мне, что происходит отслеживание восходящего потока, но я все еще не вижу отслеживаемую ветвь в журнале локального репо даже после получения удаленного репо.

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

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

Предыстория Я работаю инженером-технологом в небольшой команде. Мы хотели бы настроить рабочий процесс с использованием центрального общего удаленного репозитория Git для команды. Я пытался установить демонстрацию того, как это будет работать, с каталогом "centralRepo.git" ниже, являющимся нашим центральным репозиторием, и имея другие папки, члены команды могут клонировать центральный пульт.

Поскольку у нас уже есть существующая работа, но нет существующего центрального удаленного репо, мы начнем с существующего репо в "davesClones", которое будет отправлено на центральный пульт, а затем клонировано в папки других членов команды по мере необходимости, например, "stevesClones."

Что я ожидаю увидеть, работает ли отслеживание: если я клонирую обычное локальное репо, отслеживание настраивается автоматически, и журнал показывает мне собственные ветки моих клонов вместе с ветвью "origin", которую он отслеживает из каталога, в котором он был клонировано из, как показано на скриншоте ниже, обведенном синим цветом:

Попытка №1: Проталкивание с установкой восходящего потока:

Я попытался переместить существующее локальное репо в новое центральное удаленное репо, используя git push --set-upstream <remote> masterкак показано ниже, и даже несмотря на то, что в выводе говорится, что отслеживание настроено, я не вижу никакого отслеживания в журнале git, как это было при клонировании обычного репо, даже после использования fetch. Примеры ниже показывают, как мне не хватает ветки отслеживания происхождения в журнале после выполнения вышеуказанных шагов:

Попытка №2: Клонирование без покрытия:

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

Есть идеи, почему я не вижу трекинг в моем журнале? (Это означает, что после клонирования стандартного локального репо я вижу отслеживающий [origin/master, origin head], но не могу получить это в моем журнале, когда я использую push --set-upstream для отправки локального репо на удаленный, либо при использовании git clone --bare, чтобы клонировать локальное репо на голый пульт?)

Кроме того, в локальном репо есть фиксация, поэтому оно не пустое при нажатии или клонировании на удаленный компьютер.

Спасибо!

1 ответ

Решение

TL;DR

Вам нужно запустить весь процесс, настроив пульт в собственном репозитории Git:

git remote add <name> <URL-or-path>

после чего вы должны использовать name часть, которую вы использовали, вместо ввода (предположительно более длинного) URL-адреса или пути. То есть вы будете делать:

git remote add origin /d/Seafile/...
git push --set-upstream origin master

Длинный

Позвольте мне начать с того, что мне очень не нравится здесь слово " отслеживание", поскольку оно вводит всех в заблуждение. Это случилось и с вами.

Мы должны использовать git remoteсоздавать или иным образом управлять пультами. Пульт - это просто короткое имя, напримерorigin, который является своего рода стандартным именем для использования для удаленного компьютера, в котором будет храниться URL-адрес (и некоторая другая информация, более внутренняя для Git).

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

git push --set-upstream /d/Seafile/Development/gitTest/centralRepo.git master

Давайте быстро пройдемся по документации Git. Синтаксис дляgit pushописан в строках ОБЗОР документации как (сокращенно):

git push [options] [repository [refspec...]]

Здесь твой единственный вариант --set-upstream (что само по себе нормально), а ваш репозиторий задается как путь, /d/Seafile/.... Если вы перейдете в раздел OPTIONS, параметр репозитория будет описан слишком кратко следующим образом:

<repository>
"Удаленный" репозиторий, который является местом назначения операции push. Этот параметр может быть URL-адресом... или именем удаленного...

К сожалению, здесь не указано, что --set-upstream, и желаемый вид отслеживания работает только в том случае, если заданный параметр является удаленным.

Имя пути, например /d/Seafile/...- на который ваш Git внутренне переведен D:/Seafile/... как вы можете видеть в других выходных данных - считается URL-адресом, а не "удаленным".

Пульты и имена удаленного отслеживания

Вместо того, чтобы говорить, что имя ветки отслеживает другое имя, я предпочитаю использовать фразу имеет в качестве восходящего потока. Эта фраза, к сожалению, немного неудобная (отсюда и использование Git слова track как глагола). Любое имя ветки может не иметь ни одного восходящего потока, либо одного восходящего потока. Когда ветвь делает есть вверх по течению, что может быть:

  • другое название ветки, например, develop мог бы иметь master как его восходящий поток, или
  • имя удаленного отслеживания, напримерorigin/master.

Я называю такие имена, как origin/master имена удаленного отслеживания (в документации Git эти ветки чаще всего называются именами удаленного отслеживания). Они возникают в результате объединения имен пульта дистанционного управления, напримерorigin, с именем ветки: имя ветки в Git, с которой общается ваш Git, когда ваш Git звонит другому Git, используя URL-адрес, хранящийся под этим "удаленным".

Когда вы используете git fetch или git push, у вас есть телефон Git, подключите другой Git. Есть два Git'а; у каждого Git есть свои ветки. У вашего Git есть свои ветки, а у их Git - свои. Ваш Git предлагает запомнить их имена для вас в качестве услуги... но для того, чтобы ваш Git запомнил имена их веток, ваш Git должен придумать имя для каждой из них, которое не мешает вашим собственным именам веток. Ваш Git делает это, вставляя что-то перед именами веток. 1

Часть, которая здесь вставляется впереди, - это удаленное имя, например,origin. Без пульта ДУ - с URL-адресом - вставлять на передний план нечего, поэтому вставка вперед никогда не происходит. В--set-upstream опция становится неработоспособной.

Итак, почему ваш Git напечатал:

Branch 'master' set up to track remote branch 'master' from 'D:/Seafile/Development/gitTest/centrapRepo.git'.

? Единственный возможный ответ здесь - Git очень похож на Gitty. Он просто сказал, что сделал что-то, чего не может сделать физически, и поэтому не сделал.


1 Технически имена удаленного отслеживания находятся в отдельном пространстве имен: имена ветвей имеют полностью прописанные имена, начинающиеся сrefs/heads/, так что master действительно refs/heads/master. Имена удаленного отслеживания начинаются сrefs/remotes/и включите имя пульта и еще одну косую черту. Остальная часть имени - это урезанное имя ветки, видимое на этом пульте по URL-адресу. Так что ихrefs/heads/master становится вашим refs/remotes/origin/master, который отображается в разрезе до origin/master.

Другие вопросы по тегам