git clone с поддеревьями - префикс уже существует
У меня есть репо, которое содержит два поддерева в папке "external/".
Когда я клонирую репозиторий, он загружает все файлы, включая код, который я ранее вставил после команды git subtree.
Теперь, если я хочу клонировать это хранилище на другом компьютере и воссоздать структуру поддерева, команда git subtree add завершится неудачно, поскольку папка, в которую я хочу поместить поддерево, уже содержит папку и файлы.
Вот команды, которые я выполнил:
> git clone https://URL/<main>
> git remote add <component> https://URL/<component>
> cd <main>
> git subtree add --prefix external/<component> <component> master
ERROR: prefix 'external/<component>' already exists.
Как это решить? Или есть ли лучший способ воссоздать структуру поддерева для новых операций клонирования?
3 ответа
Суть поддерева Git в том, что вам не нужно ничего "воссоздавать" в другом месте или на другом компьютере. Когда тыclone
репозиторий, он уже содержит поддерево в виде обычных файлов с помощью обычных коммитов!
Если вы просто хотите "обновить" или "обновить" содержимое поддерева, попробуйте pull
.
git subtree pull --prefix external/<component> <component> master
Если по какой-то причине (и не могли бы вы пояснить) вы действительно хотите начать все сначала, вам нужно удалить подкаталог, а затем повторно добавить поддерево.
git rm -fr external/<component>
git commit -m "Removing old subtree"
git subtree add --prefix external/<component> <component> master
Я хочу сделать то же самое и полностью понять, почему существующие два ответа не принимаются, потому что следующий вопрос/проблема не решена:
Я хочу клонировать этот основной репозиторий на другой компьютер и воссоздать структуру поддерева, но команда добавления поддерева Git не работает, потому что папка, в которую я хочу поместить поддерево, уже содержит папку и файлы.
Что ж, ответ/решение простое. Вы не --
The
git subtree add
нужно сделать только один раз в репозитории git, во время первого/начального импорта, и никогда не нужно делать это снова. Подробная причина/объяснение здесь.
Итак, в клонированном новом основном репозитории, если вы хотите нажать на поддерево, просто
- Повторить
git remote add
в новом репозитории, который вы делали в старом репо раньше, только один раз в качестве настройки. - Затем нажмите на поддерево так же, как вы делали в старом репо раньше
git subtree push --prefix external/<component> <component> master
Виола! Поддерево git теперь также можно обновить из нового местоположения/репозитория.
Вы получаете ошибку, потому что substree
уже существует:
ERROR: prefix 'external/<component>' already exists.
Это связано с тем, что при клонировании основного репо вы также получили код из subtree
. При добавлении поддерева в репо вы фиксируете код из внешней ветки / хэша коммита в исходное репо; вы фиксируете источник в своем репо, а не связываетесь с внешним репо. Если / когда вы хотите вставить базу кода в более новую фиксацию из исходного репо поддерева, вы можете выполнить команду:
git subtree pull --prefix external/<component> <component> <branch>
Эта команда втянет HEAD
из указанного репо и ветки и помещает код поверх существующего кода в /external/<comonent>
путь. После того, как вы выполните этоsubtree
команду, вам все равно нужно будет выполнить git commit
обновить код.
Ключевое замечание о Git: поддерево отличается от подмодуля тем, что подмодуль создает ссылку / ярлык / ссылку в исходном репо на другое (внешнее) репо. С подмодуль разработчик клонировать репозиторий должен также иметь полномочия / доступ к подмодуль-репо, чтобы тянуть, что связано код в репозиторий быть клонированы. Поддерева является кодом фиксации в корневой репозиторий. Поэтому, если у вас есть доступ к репо, которое вы клонируете, вам не нужен доступ к внешнему репо, указанному в поддереве.