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
?
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
?
Odpowiedzi:
Musisz tylko utworzyć nową gałąź lokalną o żądanej nazwie, wcisnąć ją do pilota, a następnie usunąć starą gałąź zdalną:
$ git branch new-branch-name origin/old-branch-name
$ git push origin --set-upstream new-branch-name
$ git push origin :old-branch-name
Następnie, aby zobaczyć starą nazwę oddziału, każdy klient repozytorium musiałby zrobić:
$ git fetch origin
$ git remote prune origin
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” .
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:
git push <remote> <remote>/<old_name>:refs/heads/<new_name> :<old_name>
Napisałem ten skrypt ( git-rename-remote-branch ), który zapewnia przydatny skrót do łatwego wykonywania powyższych czynności.
Jako funkcja bash:
git-rename-remote-branch(){
if [ $# -ne 3 ]; then
echo "Rationale : Rename a branch on the server without checking it out."
echo "Usage : $(basename $0) <remote> <old name> <new name>"
echo "Example : $(basename $0) origin master release"
exit 1
fi
git push $1 $1/$2:refs/heads/$3 :$2
}
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ępnie git push <remote> :<old_name>
usuwając starą gałąź zdalną.
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ępnie git push [space]:<old_name>
usunięcie starego pilota
refs/heads/name
? Czy nie możesz użyć name
bezpośrednio, wykonując pierwsze polecenie git 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ć:
git branch -m old_branch new_branch
git push -u origin new_branch
Aby usunąć stary oddział z remote
:
git push origin :old_branch
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.
„Zmiana nazwy” zdalnej gałęzi jest w rzeczywistości procesem dwuetapowym (niekoniecznie zamówionym):
git push [space]:<old_name>
jak wyjaśnił ksrb );Korzystam z TortoiseGit i kiedy po raz pierwszy próbowałem usunąć gałąź za pomocą wiersza poleceń, otrzymałem:
$ git push origin :in
fatal: „origin” nie wydaje się być repozytorium git
fatal: Nie można odczytać ze zdalnego repozytorium.
Upewnij się, że masz odpowiednie prawa dostępu, a repozytorium istnieje.
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 (np git.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ą :
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 :
Jeśli brakuje konfiguracji, domyślnie jest to
origin
.
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.
origin
. Musisz nazwać swojego pilota, gdy tylko uruchomisz polecenie git remote
. Git współpracuje z ssh
tym, co sugeruje, że używasz kluczy publicznych + prywatnych. Zakładam, że Autoload Putty keys
TortoiseGit po prostu automatycznie ładuje potrzebne klucze, abyś mógł cokolwiek zrobić za pomocą zdalnego odwołania. Ostatnią rzeczą jest to, że git 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łem git 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 potrzebujesz git push <remote>
, a jeśli jeszcze go nie ma, dodaj git 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.
git branch new-branch-name origin/old-branch-name
git push origin --set-upstream new-branch-name
git push origin :old-branch-name
Muszę rozbroić strumień wyjściowy, a następnie ponownie ustawić strumień. Oto jak to zrobiłem.
git checkout -b new-branch-name
git branch --unset-upstream
git push origin new-branch-name -u
git branch origin :old-branch-name
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:
git push origin old_branch:new_branch
git push origin :old_branch
Możesz utworzyć nowy oddział na podstawie oddziału o starej nazwie. Tak po prostu usuń starą gałąź !!!
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)
if git ls-remote --heads "$remote" \
| cut -f2 \
| sed 's:refs/heads/::' \
| grep -q ^"$newname"$; then
echo "Error: $newname already exists"
exit 1
fi
git push "$oldname" "$remote/$oldname:refs/heads/$newname" ":$oldname"
(czek pochodzi z tej odpowiedzi )
git show-ref --quiet --verify -- refs/heads/$new_name
zamiast ls-remote | cut | sed | grep
.
git push origin origin/old_name:refs/heads/new_name && git push origin :old_name
.