Jeśli istnieje repozytorium, do którego mam tylko git://
dostęp (i zwykle wystarczyłoby push + pull), czy istnieje sposób na zmianę nazwy gałęzi w tym repozytorium w taki sam sposób, w jaki zrobiłbym to lokalnie git branch -m
?
407
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.Odpowiedzi:
Musisz tylko utworzyć nową gałąź lokalną o żądanej nazwie, wcisnąć ją do pilota, a następnie usunąć starą gałąź zdalną:
Następnie, aby zobaczyć starą nazwę oddziału, każdy klient repozytorium musiałby zrobić:
UWAGA: Jeśli twoja stara gałąź jest główną gałęzią, powinieneś zmienić ustawienia głównej gałęzi. W przeciwnym razie po uruchomieniu
$ git push origin :old-branch-name
pojawi się błąd „usunięcie bieżącego oddziału zabronione” .źródło
git fetch origin --prune
(aby skutecznie pobrać nowe gałęzie, a także pozbyć się referencji już nie na pilocie).-d
lub--delete
zamiast:
w nowszych wersjach git.Jeśli naprawdę chcesz po prostu zmienić nazwę gałęzi zdalnie, bez zmiany nazwy żadnych oddziałów lokalnych w tym samym czasie , możesz to zrobić za pomocą jednego polecenia:
Napisałem ten skrypt ( git-rename-remote-branch ), który zapewnia przydatny skrót do łatwego wykonywania powyższych czynności.
Jako funkcja bash:
Aby zintegrować komentarz @ ksrb : W zasadzie wykonuje to dwa
git push <remote> <remote>/<old_name>:refs/heads/<new_name>
naciśnięcia jednego polecenia, najpierw wypychając nową gałąź zdalną na podstawie starej gałęzi zdalnego śledzenia, a następniegit push <remote> :<old_name>
usuwając starą gałąź zdalną.źródło
git push <remote>/<old_name>:refs/heads/<new_name>
naciśnięcia oznaczają wypchnięcie nowego pilota, który używa starego pilota jako src, a następniegit push [space]:<old_name>
usunięcie starego pilotarefs/heads/name
? Czy nie możesz użyćname
bezpośrednio, wykonując pierwsze poleceniegit push <remote> <remote>/<old_name>:<new_name>
?<new_name>
jeszcze nie istnieje. Jeśli gałąź nie istnieje, Git wymaga użycia pełnej nazwy, ponieważ w przeciwnym razie<new_name>
może również odnosić się do nazwy znacznika.refs/heads/<new_name>
już istnieje. Usuwanie nadal kończy się powodzeniem, co powoduje<remote>/<old_name>
jedynie usunięcie. Niektóre sprawdzanie przed ręką może tego łatwo uniknąć.Pierwsza kasa do oddziału, którego nazwę chcesz zmienić:
Aby usunąć stary oddział z
remote
:źródło
git push -u origin new_branch
), W przeciwnym razie gałąź o zmienionej nazwie (new_branch) będzie nadal śledzić pochodzenie / old_branch. A kiedy usuniesz zdalny old_branch, new_branch nadal będzie śledzić pochodzenie / old_branch, choć teraz gałąź zniknęła.Pewnie. Wystarczy zmienić nazwę gałęzi lokalnie, wcisnąć nową gałąź i wcisnąć usunięcie starej.
Jedynym prawdziwym problemem jest to, że inni użytkownicy repozytorium nie będą zmieniać nazw lokalnych oddziałów śledzenia.
źródło
TL; DR
„Zmiana nazwy” zdalnej gałęzi jest w rzeczywistości procesem dwuetapowym (niekoniecznie zamówionym):
git push [space]:<old_name>
jak wyjaśnił ksrb );Kasowanie
Korzystam z TortoiseGit i kiedy po raz pierwszy próbowałem usunąć gałąź za pomocą wiersza poleceń, otrzymałem:
Było to prawdopodobnie spowodowane tym, że pageant nie ma załadowanego klucza prywatnego (który TortoiseGit ładuje się automatycznie do pageant ). Ponadto zauważyłem, że polecenia TortoiseGit nie mają w sobie
origin
ref (npgit.exe push --progress "my_project" interesting_local:interesting
.).Używam również Bitbucket i, podobnie jak innych internetowych menedżerów git online (GitHub, GitLab), mogłem usunąć zdalną gałąź bezpośrednio przez ich interfejs (strona oddziałów):
Jednak w TortoiseGit możesz również usuwać zdalne gałęzie za pomocą Przeglądaj referencje :
Klikając prawym przyciskiem myszy gałąź zdalną (listę pilotów) pojawia się opcja Usuń gałąź zdalną :
Popychanie
Po usunięciu starej zdalnej gałęzi przepchnąłem bezpośrednio do nowej zdalnej gałęzi poprzez TortoiseGit , wpisując nową nazwę w polu Remote: w oknie Push, a gałąź ta została automatycznie utworzona i widoczna w Bitbucket .
Jeśli jednak nadal wolisz to robić ręcznie, kwestią, o której jeszcze nie wspomniano w tym wątku, jest to, że
-u
=--set-upstream
.Z
git push
dokumentów ,-u
to tylko alias--set-upstream
, więc polecenia w odpowiedziach Sylvaina (-set-upstream new-branch
) i Shashank (-u origin new_branch
) są równoważne, ponieważ zdalne odwołanie domyślnie jest ustawione,origin
jeśli żadne inne odwołanie nie zostało wcześniej zdefiniowane:git push origin -u new_branch
=git push -u new_branch
z opisu dokumentacji :Ostatecznie nie wpisałem ręcznie ani nie użyłem żadnego z poleceń sugerowanych przez inne odpowiedzi tutaj, więc być może może to być przydatne dla innych w podobnej sytuacji.
źródło
origin
. Musisz nazwać swojego pilota, gdy tylko uruchomisz poleceniegit remote
. Git współpracuje zssh
tym, co sugeruje, że używasz kluczy publicznych + prywatnych. Zakładam, żeAutoload Putty keys
TortoiseGit po prostu automatycznie ładuje potrzebne klucze, abyś mógł cokolwiek zrobić za pomocą zdalnego odwołania. Ostatnią rzeczą jest to, żegit push -u
nie jest to alias do wypychania do zdalnej gałęzi, to alias do wypychania do zdalnej gałęzi, która została utworzona lokalnie, a jej zdalne odwołanie nie ma jeszcze tej gałęzi .-u
to alias--set-upstream
i „jeśli brakuje konfiguracji, domyślnie jest toorigin
”. Sylvain i Shashank używają tego do wypychania do nowo utworzonego zdalnego oddziału . Kluczowy problem może być ze względu na korowód nie mając załadowany kiedy próbowałemgit push origin :in
na skorupce. Więc nie rozumiem twojego zdania, po prostu wskazałem moje i nieadresowane szczegóły w innych odpowiedziach, wyjaśniłem je i rozwiązałem.-u
to alias dla,--set-upstream
ale nie jest to alias do wypychania do zdalnej gałęzi, jak powiedziałeś. Aby przepchnąć się do zdalnego oddziału, którego wyjątkowo potrzebujeszgit push <remote>
, a jeśli jeszcze go nie ma, dodajgit push -u <remote>
. Dlatego-u
służy do tworzenia odniesienia do oddziału w zdalnym.Nie wiem dlaczego, ale odpowiedź @Sylvain Defresne nie działa dla mnie.
Muszę rozbroić strumień wyjściowy, a następnie ponownie ustawić strumień. Oto jak to zrobiłem.
źródło
Nie wiem, czy to jest dobre, czy złe, ale przesunąłem „starą nazwę” gałęzi do „nowej nazwy” gałęzi, a następnie całkowicie usunąłem starą gałąź z następującymi dwoma wierszami:
źródło
Możesz utworzyć nowy oddział na podstawie oddziału o starej nazwie. Tak po prostu usuń starą gałąź !!!
źródło
Dodając do już udzielonych odpowiedzi, oto wersja, która najpierw sprawdza, czy nowy oddział już istnieje (abyś mógł bezpiecznie używać go w skrypcie)
(czek pochodzi z tej odpowiedzi )
źródło
git show-ref --quiet --verify -- refs/heads/$new_name
zamiastls-remote | cut | sed | grep
.