Jak „cofnąć” klon jednogałęziowy?


104

Sklonowałem repozytorium przy użyciu rozszerzenia

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

Sklonowałem TYLKO tę gałąź, ale teraz chcę przełączyć się na master i inne gałęzie. Czy jest jakiś sposób poza wyczyszczeniem go i rozpoczęciem od nowa klonowania reszty repozytorium, że mogę cofnąć preferencję --single-branch?

Odpowiedzi:


149

Możesz powiedzieć Gitowi, aby ściągnął wszystkie gałęzie w ten sposób:

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

Jeśli zajrzysz do środka .git/config, będzie wyglądać mniej więcej tak:

[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

Porównałem to z pełnym klonem i zobaczyłem, że jedyną różnicą było „pobieranie” poniżej [remote "origin"].

Uwaga: używam Git w wersji 1.8.2. Opcje konfiguracji mogły ulec zmianie, jeśli używasz starszej wersji Git. Jeśli moje polecenia nie działają, radzę przejrzeć, .git/configaby zobaczyć, czy widzisz coś podobnego.


2
Chciałem ci tylko podziękować, ponieważ bardzo dużo czytałem i szukałem w Google i nie mogłem znaleźć czegoś takiego.
danieltalsky,

2
Miło, że mogłem pomóc. gitNarzędzie wiersza polecenia jest niezwykle silny (w rzeczywistości, większość poleceń są realizowane pod względem innych poleceń), więc można zrobić mnóstwo rzeczy z nim kiedyś zrozumiesz jak repozytorium jest określone (w zasadzie, w jaki sposób .gitdziała folderu ).
sarahhodne

To nie zadziałało - po uruchomieniu te polecenia git show-ref tagsnadal się nie udają.
felixfbecker

1
Zwróć uwagę, że to rozwiązanie zadziała również, jeśli gałąź została sklonowana płytko przy użyciu następującej składni, która ma te same niedociągnięcia opisane przez OP:git clone --depth=1 --branch branchname git@github.com:foobar/repo.git destinationpath
danemacmillan

1
Wow, to nie jest intuicyjne! To dziwne, że Git nie ma łatwo polecenia, aby to zrobić. Tak, działało ... i teraz wiem też o pliku konfiguracyjnym w katalogu .git!
kashiraja

62

Jeśli chcesz dodać pojedynczy oddział, możesz wykonać następujące czynności:

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

Działa z git w wersji 1.9.1


1
Jestem w tobie zakochany
user1760150

4
Dodaje to wiele fetch =linii do .git / config, bardzo przydatne, gdy chcesz przełączać się między dwoma gałęziami na pilocie, ale nie chcesz pobierać całej grupy innych gałęzi. Dzięki!
Terry Brown

5

Aby dodać kolejną zdalną gałąź do mojego lokalnego repozytorium, które zostało sklonowane przy użyciu --single-branch, działa dla mnie następujące rozwiązanie:

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

Możesz też użyć symboli wieloznacznych [remote-branch]np

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

Działa to przy użyciu git w wersji 2.21.1 . Inne odpowiedzi sugerujące, aby to zrobić, git fetch origin [remote-branch]:[local-branch]nie zadziałały, ponieważ tworzy lokalny oddział w stanie nieśledzonym. Podczas uruchamiania git pullnajpierw próbowałem scalić wszystkie zatwierdzenia zdalnego oddziału z moim lokalnym.


2
drugi raz wracam do tej odpowiedzi. bardzo przydatne. dzięki!
około

1
Najbardziej przydatna odpowiedź
Denis Itskovich

1

Po prostu dodaj oryginalne repozytorium jako nowego pilota i zacznij pracować?

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

Możesz nawet usunąć swój obecny pilot zdalnego sterowania „pochodzenia” i zmienić nazwę „myNewOrigin” na „pochodzenie”, jeśli chcesz.

Stamtąd możesz wyciągnąć / scalić / ponownie bazować.


0

Wystarczy zmienić .git/configplik z lokalnego repo, linia fetchod [remote origin] section.

Przed czymś takim

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

Po tym będzie tak

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

0

Początkowo zastosowałem odpowiedź Dominika Pawlaka i zadziałało. Ale nie mogłem wprowadzić żadnych dalszych zmian po tym, jak wprowadziłem więcej kodu do mojej nowej gałęzi.

Istnieje inny sposób całkowitego resetowania single-branch, o którym tutaj nie wspomniano:

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

Spowoduje to zresetowanie wszystkiego do oryginału.


0

U mnie pracował:

git remote remove origin
git remote add origin https://*<yourPath>*.git
git fetch
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.