Как мне «отменить» клон с одной ветвью?


104

Я клонировал репо, используя

git clone -b <branch name> --single-branch <github url> <target directory>

Это клонировало ТОЛЬКО эту ветку, но теперь я хочу переключиться на главную и другие ветки. Есть ли какой-либо способ, кроме его очистки и начала клонирования остальной части репо, который я могу отменить предпочтение --single-branch?

Ответы:


149

Вы можете сказать Git, чтобы он вытащил все ветки следующим образом:

git config remote.origin.fetch "+refs/heads/*:refs/remotes/origin/*"
git fetch origin

Если заглянуть внутрь .git/config, это будет выглядеть примерно так:

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
    ignorecase = true
    precomposeunicode = false
[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/master:refs/remotes/origin/master
[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

Я сравнил это с полным клоном и увидел, что единственной разницей была "выборка" ниже [remote "origin"].

Примечание. Я использую Git версии 1.8.2. Параметры конфигурации могли измениться, если вы используете старую версию Git. Если мои команды не работают, я бы порекомендовал просмотреть, .git/configчтобы увидеть что-то подобное.


2
Просто хотел выразить вам особую благодарность, потому что я чертовски много читал и искал в Google и не смог найти ничего подобного.
danieltalsky

2
Рад помочь. Инструмент gitкомандной строки невероятно мощный (на самом деле, большинство команд реализовано в терминах других команд), поэтому вы можете делать с ним массу вещей, когда понимаете, как устроен репозиторий (в основном, как .gitработает папка ).
sarahhodne

У меня это не сработало - после запуска этих команд git show-ref tagsвсе еще не работает.
felixfbecker

1
Обратите внимание, что это решение также будет работать, если ветка была неглубоко клонирована с использованием следующего синтаксиса, который имеет тот же недостаток, что описал OP:git clone --depth=1 --branch branchname git@github.com:foobar/repo.git destinationpath
danemacmillan

1
Вау, это далеко не интуитивно! Странно, что у Git нет команды для этого. Да, у меня все заработало ... и теперь я знаю о файле конфигурации в каталоге .git!
kashiraja

62

Если вы хотите добавить одну ветку, вы можете сделать следующее:

git remote set-branches --add origin [remote-branch]
git fetch origin [remote-branch]:[local-branch]

Работает с git версии 1.9.1


1
Я влюблен в тебя
user1760150

4
Это добавляет несколько fetch =строк в .git / config, что очень удобно, когда вы хотите переключаться между двумя ветвями на удаленном компьютере, но не получать целую кучу других веток. Спасибо!
Терри Браун

5

Чтобы добавить еще одну удаленную ветку в мой локальный репозиторий, который был клонирован с помощью --single-branch, у меня работает следующее:

git remote set-branches --add origin [remote-branch]
git fetch
git checkout [remote-branch]

Вы также можете использовать подстановочные знаки [remote-branch], например,

git remote set-branches --add origin release-1.*
git fetch
git checkout release-1.5

Это работает с использованием git версии 2.21.1 . Другие ответы, предлагающие сделать git fetch origin [remote-branch]:[local-branch], не сработали, поскольку он создает локальную ветвь в неотслеживаемом состоянии. При запуске git pullон сначала попытался объединить все коммиты удаленной ветки с моей локальной еще раз.


2
второй раз возвращаюсь к этому ответу. очень полезно. Спасибо!
Godbout

1
Самый полезный ответ
Денис Ицкович

1

Просто добавить исходное репо как новый пульт и работать оттуда?

git remote add path/to/myrepo myNewOrigin
git fetch myNewOrigin

Вы даже можете удалить текущий пульт origin и переименовать myNewOrigin в origin, если захотите.

Оттуда вы можете вытащить / объединить / переустановить.


0

Просто изменить .git/configфайл вашего локального репозитория, строка fetchиз [remote origin] section.

До чего-то вроде этого

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/master:refs/remotes/origin/master

После будет так

[remote "origin"]
    url = https://github.com/owner/repo.git
    fetch = +refs/heads/*:refs/remotes/origin/*

0

Сначала я применил ответ Доминика Павляка, и он сработал. Но я не смог внести никаких дальнейших изменений после того, как добавил больше кода в свою новую ветку.

Есть еще один способ single-branchполного сброса , о котором здесь не упоминалось:

git remote remove origin
git remote add origin git@gitlab.com:{yourProject}/{yourRepo}.git
git branch --set-upstream-to=origin/{yourBranch}  {yourBranch}
git pull

Это сбрасывает все в исходное состояние.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.