Zmiana domyślnego „push” na Git Remote


228

Chcę zmienić domyślny docelowy oddział firmy Git, abym mógł to zrobić

git push

Zamiast:

git push upstream

Obecnie jest ustawiony na pilota źródłowego i chcę ustawić go na innego pilota.

Próbowałem usunąć oryginalny (sklonowany z) pilot

git remote rm origin

Który usunął oryginalny pilot. Ale nie rozwiązuje git pushproblemu. Nadal otrzymuję:

fatal: Brak skonfigurowanego miejsca docelowego push. Podaj adres URL z
wiersza polecenia lub skonfiguruj zdalne repozytorium za pomocą ...

Próbowałem także grać z:

git remote set-url --push myfork origin

i inne opcje, ale żadna nie wydaje się działać (może dlatego, że zbyt wcześnie usunąłem pilot źródłowy?)

Po odpowiedzi tutaj próbowałem zmienić:

git config push.default upstream (or matching)

ale żadne nie działało.

Odpowiedzi:


215

Możesz użyć, git push -u <remote_name> <local_branch_name>aby ustawić domyślny upstream. Aby uzyskać więcej informacji, zobacz dokumentację git push .


1
Nie działa: otrzymuję komunikat „fatal:„ origin ”nie wydaje się być repozytorium git fatal: Zdalny koniec zawiesił się nieoczekiwanie„ ”może dlatego, że usunąłem pilot origin przed przejściem dalej. właśnie znalazłem działające rozwiązanie, zaktualizuję w odpowiedzi
alonisser

34
Dodatkowym wyjaśnieniem powinna być składnia git push -u <remote_name> <local_branch_name>:<corresponding_remote_branch_name>.
Marco Lazzeri

33
Przykład: git push -u origin master:master.
starbeamrainbowlabs

1
Po ustawieniu domyślnego zdalnego ... czy w ogóle nie można zmusić git pushdo wypchnięcia zdalnej gałęzi bieżącego lokalnego oddziału? Mam na myśli to, że muszę uruchomić to polecenie dla każdej gałęzi. Dobrze? Czy nie mogę po prostu przeprowadzić wstępnej konfiguracji dla całego repo? @MarcoLazzeri
Honey

2
@starbeamrainbowlabs Nie git push -u origin masterwystarczy? Czy tylko ilustrujesz pełną składnię?
Josiah Yoder

108

Aby zmienić, który pilot nadrzędny jest „podłączony” do twojej gałęzi, użyj git branchpolecenia z flagą konfiguracji nadrzędnej.

Najpierw upewnij się, że pilot istnieje:

git remote -vv

Ustaw preferowany pilot dla bieżącej (pobranej) gałęzi:

git branch --set-upstream-to <remote-name>

Sprawdź, czy gałąź jest skonfigurowana przy użyciu poprawnego zdalnego pilota:

git branch -vv


2
Właśnie próbowałem git branch --set-upstream-to myforki dostałem błąd:> błąd: nieznana opcja `set-upstream-to 'Korzystam z git 1.7.9
alonisser 15.09.13

3
Składnia zmieniła się w 1.8, patrz stackoverflow.com/questions/520650/…
jtniehof

1
Zobacz następującą odpowiedź: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich

10
git branch -u <remotename>/<branch>pracował dla mnie. Polecenie zostało uruchomione przy zaznaczonym lokalnym oddziale będącym przedmiotem zainteresowania. Zobacz „Śledzenie oddziałów” w git-scm.com/book/it/v2/Git-Branching-Remote-Branches
norio

2
Pełne wyjście komendy zdalnej jest naprawdę po prostu git remote -vlub git remote --verbose. -vv„S extra v jest zbędny.
Artif3x

45

Praca z Git 2.3.2 ...

git branch --set-upstream-to myfork/master

Teraz status, pushi pullsą skierowane do myforkzdalnego


Działa to wtedy, gdy chcesz również ustawić domyślną wartość pull.
StingyJack

39

Za pomocą tego polecenia możesz łatwo zmienić domyślny pilot dla oddziałów jednocześnie

git push -u <remote_name> --all

14
Należy zauważyć, że popchnie to wszystkich, a także zmieni ich pilota zdalnego sterowania.
poolie

16

Jeśli to zrobiłeś git push origin -u localBranchName:remoteBranchNamei po sekwencjach git pushpoleceń pojawią się błędy, które wtedy nie istnieją, wykonaj następujące kroki:

  1. git remote -v

Sprawdź, czy jest jakiś pilot, który mnie nie obchodzi. Usuń je za pomocągit remote remove 'name'

  1. git config --edit

Poszukaj możliwych oznak starego / nieistniejącego pilota. Poszukaj pushdefault:

[remote]
  pushdefault = oldremote

Zaktualizuj oldremotewartość i zapisz.

git push powinien działać teraz.


2
Dzięki! Zwykle dodam -u, używając git pushinnego pilota ze względu na pamięć mięśni. To sprawia, że ​​dany pilot jest domyślny, cofnięcie go za pomocą git config --edit(lub ponowne naciśnięcie i ustawienie nowego pilota) rozwiązało problem.
Tim Visée

13

Tylko wyjaśnienie (za pomocą gita w wersji 1.7.9.5 na Ubuntu 12.04):

Git doda / usunie piloty. Są to zdalne wystąpienia git z podłączonym serwerem.

git remote add myremote git://remoteurl

Następnie możesz pobrać repozytorium git w następujący sposób:

git fetch myremote

Wygląda na to, że tworzy gałąź o nazwie „myremote”, jednak pilot dla gałęzi nie jest ustawiany automatycznie. Aby to zrobić, musisz wykonać następujące czynności:

Najpierw sprawdź, czy masz ten problem, tj

git config -l | grep myremote

Powinieneś zobaczyć coś takiego:

remote.myremote.url=git://remoteurl
remote.myremote.fetch=+refs/heads/*:refs/remotes/myremote/*
branch.myremote.remote=.
branch.myremote.merge=refs/heads/master

Jeśli widzisz branch.myremote.remote=., powinieneś kontynuować:

git config branch.myremote.remote myremote
git checkout myremote
git pull

Powinieneś teraz być na bieżąco ze zdalnym repozytorium, a twoje ściągnięcia / wypychania powinny być powiązane z odpowiednim pilotem. W ten sposób możesz przełączać piloty dla poszczególnych oddziałów . [Notatka 1]

Zgodnie z oficjalną dokumentacją konfiguracji Git , możesz ustawić domyślną gałąź push (po prostu wyszukaj remote.pushdefault na tej stronie), jednak pamiętaj, że nie wpłynie to na repozytoria / gałęzie, które już istnieją, więc będzie działać, ale tylko dla nowych repozytoriów / oddziałów. Powinieneś pamiętać, że --globalustawi specyficzne dla użytkownika wartości domyślne repozytorium (~ / .gitconfig), --systemustawi ogólnosystemowe wartości domyślne repozytorium (/ etc / gitconfig), a żadna flaga nie ustawi opcji konfiguracji dla bieżącego repozytorium (./.gitconfig).

Należy również zauważyć, że opcja konfiguracji push.default służy do konfigurowania zachowania specyfikacji , a nie zachowania zdalnego .

[1]: git branch --set-upstream myotherremotezwykle działałby tutaj, jednak git będzie narzekał, że jeśli nie git branch --set-upstream myremotezostanie użyty, nie ustawi gałęzi jako własnego pilota . Uważam jednak, że jest to nieprawidłowe zachowanie.


Zamiast tego git config -l | grep myremotemożesz po prostu użyć:git config --get branch.myremote.remote
Murmel

@Murmel po pierwsze, jest to wiki społeczności, więc nie krępuj się ulepszać, po drugie, --getzakładam szczególne zachowanie, zauważam, że istnieją inne sposoby ustawiania strumieni, ale zapewnia to sposób na znalezienie informacji bez polegania tylko na narzędziach git poprawny. Git nie jest doskonały, lepiej zrozumieć dane, co robi i mieć nadzieję, że jego wywołania będą działać poprawnie.
smaudet

10

Przydatne może być zajrzenie do .git/configrepozytorium, wyświetli ono listę wszystkich pilotów, a także domyślnego pilota dla każdej gałęzi

na przykład.

[core]
    repositoryformatversion = 0
    filemode = true
    bare = false
    logallrefupdates = true
[remote "origin"]
    url = git@gitea.xxx.be:fii/web2016.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "bugfix/#8302"]
    remote = origin
    merge = "refs/heads/bugfix/#8302"
[branch "feature/#8331"]
    remote = origin
    merge = "refs/heads/feature/#8331"
[remote "scm"]
    url = https://scm.xxx.be/git/web2016bs.git
    fetch = +refs/heads/*:refs/remotes/scm/*

możesz wprowadzić ręczne zmiany w tym pliku, aby usunąć niechcianego pilota, lub zaktualizować domyślne piloty dla różnych gałęzi

  • Zwróć uwagę! podczas zmiany lub usuwania pilotów należy zaktualizować wszystkie odniesienia do niego w tym pliku konfiguracyjnym

5

Kolejną techniką, którą właśnie znalazłem w celu rozwiązania tego problemu (nawet jeśli najpierw usunąłem pochodzenie, co wydaje się błędem), jest bezpośrednie manipulowanie git config:

git config remote.origin.url url-to-my-other-remote

5
To nie jest dobre rozwiązanie, użytkownicy git powinni mieć możliwość pobierania / wypychania z wielu repozytoriów - chociaż to pozwoli ci zmienić pilota oryginału, nie oznacza to, że POWINIENEŚ zmienić pilota oryginału, ponieważ prawdopodobnie oznacza to, że tam występuje wiele niezgodności między pilotami. Scalenie pomoże tutaj, ale jest to zarówno prostsze, jak i zachowuje więcej historii, aby ustawić pilota w nowej gałęzi.
smaudet

Nie jest to właściwy sposób ... Odpowiedź Jordana jest bardziej odpowiednia
Raja Anbazhagan

1
Zobacz także: stackoverflow.com/a/2432799/1820106 ( git remote set-url origin PATH_TO_REMOTE)
Yinon Ehrlich

5

Bardzo prosto i łącząc niektóre świetne komentarze tutaj wraz z moimi własnymi badaniami na ten temat.

Najpierw sprawdź lokalny oddział, który chcesz powiązać ze zdalnym oddziałem:

git checkout mybranch

Kolejny:

git branch -u origin/mybranch

gdzie:

git branch -u {remote name}/{branch name}

Powinieneś otrzymać wiadomość:

"Branch mybranch set up to track remote branch mybranch from origin."

3

W moim przypadku naprawiłem: * uruchom git config --edit * W pliku konfiguracyjnym git:

[branch "master"]
remote = origin # <--- change the default origin here

0

git remote set-url --push origin powinien działać, jak wspomniałeś, ale musisz jawnie podać adres URL zamiast alternatywnej nazwy zdalnej, np

git remote set-url --push origin git@github.com:contributor/repo.git

Możesz potwierdzić, czy to zadziałało, wykonując git remote -v. Na przykład

λ ~/go/src/github.com/stretchr/testify/ master git remote -v
fork    git@github.com:contributor/testify.git (fetch)
fork    git@github.com:contributor/testify.git (push)
origin  git@github.com:stretchr/testify (fetch)
origin  git@github.com:contributor/testify.git (push)
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.