Git: Prawidłowy sposób zmiany Active Branch w czystym repozytorium?

195

Mam nagie repozytorium, które służy jako centralny sklep dla mojego projektu. Wszyscy programiści robią to, git clone <repo>aby się z tym podzielić. Kiedy robią klon, otrzymują kasę gałęzi master (chyba że robią git clone -n), ponieważ repo.git/HEADzawiera ref: refs/heads/master, co czyni ją gałęzią aktywną .

Pytanie brzmi: jak poprawnie zmienić Active Branch ? Mógłbym po prostu zhakować repo.git/HEADplik bezpośrednio, ale wydaje się to nieprzyjemne i, no cóż, hakujące.

Próbowałem zrobić git checkout <otherbranch>w .gitkatalogu repo , ale to nie powiodło się, ponieważ nie byłem w drzewie roboczym.

Próbowałem, git update-ref HEAD refs/heads/otherbranchale właśnie zaktualizowałem refs / heads / master tak, aby były takie same jak refs / heads / otherbranch (dobra, zrobiłem to w repozytorium fikcyjnym, a nie moim produkcyjnym!)

Próbowałem git update-ref --no-deref HEAD refs/heads/otherbranchi to prawie działało. Zaktualizował HEADplik, ale ustawił go na SHA1 zatwierdzenia wskazanego przez refs/heads/otherbranch.

Testuję z wersją git 1.7.0.2.msysgit.0.

Domyślam się, że nie ma sposobu, aby to zrobić git push, ponieważ zezwolenie wszystkim na zmianę domyślnej gałęzi wydaje się nieco niebezpieczne (!), Ale na pewno jest lepszy sposób na zrobienie tego w .gitkatalogu repo niż bezpośrednie włamanie się do HEADpliku.

kbro
źródło
IMO, po prostu próbujesz zrobić tutaj Złą Rzecz. Jeśli chcesz, aby domyślna gałąź była czymś innym niż master, wtedy gałąź ta musi być master. Alternatywnie użyj dwóch różnych repozytoriów.
Nicholas Knight
12
Jak to zasadniczo próbuje zrobić coś złego? Samo repozytorium obsługuje wiele gałęzi. Używam nagiego repozytorium jako kopii zapasowej do mojego lokalnego repozytorium i jako takie tworzy kopię lustrzaną gałęzi. Mam mistrza w obu i gałąź rozwoju w obu. Jeśli chcę zobaczyć dziennik gałęzi programistycznej w nagim repozytorium, muszę zhakować pliki - wygląda na to, że git jest zasadniczo błędny w odniesieniu do obsługi samego repozytorium.
Cthutu
15
@NicholasKnight IMHO, tutaj zasadniczo się mylisz. Nie ma nic specjalnego w „master” jako nazwie oddziału, to tylko domyślna. W utrzymywanych repozytoriach nie mamy oddziału głównego, ponieważ „master” nie ma znaczenia dla firmy. Za każdym razem, gdy robimy wydanie, tworzymy nową gałąź serwisową z nowym numerem wydania i przypisujemy ją jako aktywną gałąź.
Spacemoose
@NicholasKnight Doceniam skąd pochodzisz, ale jest to pierwsze SO Q / A, które mówi mi, jak przejść na master! Miałem swoje pierwsze repo w gałęzi funkcji, kiedy utworzyłem goły klon, a kolejne klony z tego nagiego repo domyślnie korzystały z tej gałęzi zamiast z master.
Warbo,
1
Wow - to pytanie po prostu działa i działa - to mój najlepszy zdobywca punktów reputacji! Rzecz w „master” polega na tym, że jest to tylko nazwa, a jeśli nie ma to sensu dla twojej organizacji, zespołu, projektu, fazy, cokolwiek, to wybierz coś, co JEST odpowiednie, aby po sklonowaniu twojego repozytorium natychmiast przełączyli się do gałęzi, w której jako Menedżer konfiguracji chcesz, aby były włączone. Pracowałem z ClearCase (bletch!), Więc wybrałeś „main”, „main” lub „main”. Fuj
kbro

Odpowiedzi:

280

Jeśli masz dostęp do zdalnego nagiego repozytorium, ten artykuł sugeruje :

git symbolic-ref HEAD refs/heads/mybranch

Który zaktualizuje plik HEAD w twoim repozytorium, aby zawierał:

ref: refs/heads/mybranch

jak udokumentowano w git-symbolic-ref


Jeśli nie masz dostępu do zdalnego repozytorium, zobacz moją poprzednią odpowiedź .


Pamiętaj, że polecenie takie jak git remote set-head:

  • nie zmienia domyślnej gałęzi zdalnego repozytorium.
    Zmienia tylko oddział zdalnego śledzenia przechowywany w lokalnym repozytorium jakorefs/remotes/<name>/HEAD

  • nie zmienia HEADsię (tylko, tylko refs/remotes/<name>/HEAD), stąd potrzeba git symbolic-ref.

Więc git remote set-head nie ma tutaj odpowiedzi.
git symbolic-ref HEADjest, jeśli masz bezpośredni dostęp do zdalnego repozytorium.

VonC
źródło
3
Dzięki! Mam bezpośredni dostęp do zdalnego repozytorium, więc git-symbolic-ref wykona zadanie. Jednak podoba mi się sztuczka bez wspólnego przodka wspomniana w drugim wątku - zdecydowanie jedna dla dolnej szuflady. Spędziłem w tym wieku Googlinga, ale nie mogłem znaleźć twojej poprzedniej odpowiedzi, ale „git remote head master” uważa ją za drugą pozycję w rankingu, tuż poniżej git-remote (1). Dziwaczny. Po prostu pokazuje, jak trudno jest znaleźć coś, gdy nie wiesz dokładnie, czego szukasz.
kbro
git symbolic-ref HEAD refs/heads/mybranchdziałało dobrze dla mnie! DZIĘKI! ;)
vinzenzweber
1
Naprawdę doceniam to pytanie, ponieważ przypadkowo sprawdziłem inną gałąź niż master i teraz musiałem to naprawić.
Jonny Best
To mi nie działa. Dziwne, mimo że zdalny HEAD w nagim repozytorium pokazuje teraz prawidłową gałąź, git STILL domyślnie ustawia mnie na inną gałąź, kiedy ją sklonuję!
Magnus,
@Magnus byłoby dobrym pytaniem na nowej stronie.
VonC
3

Aby zmienić gałąź, musisz zmienić odniesienie HEAD na gałąź, której chcesz użyć.

Najpierw wypisz wszystkie referencje w czystym repozytorium, wykonując

$find ref

Następnie znajdź odniesienie dla swojego oddziału, format będzie następujący refs/heads/<my_branch>. Następnym krokiem jest sprawdzenie bieżącej referencji, po prostu wpisz:

$git symbolic-ref HEAD

więc wiesz, który jest obecny oddział, a następnie zaktualizuj go w razie potrzeby.

$git sumbolic-ref HEAD ref/heads/<my_branch>

To wszystko. Cieszyć się.

Saul Rosales
źródło
2

Jak poprawnie zmienić Active Branch?

  • status: git checkout w katalogu repozytorium .git zwraca błąd: Operację tę należy uruchomić w drzewie roboczym

  • wskazówki: po prostu dodaj argument --work-tree

szczegółowy przykład: założenia: goły git na zdalnym serwerze:

~ / bare_git_repository.git odłączone drzewo robocze: / var / www / myappremote

na serwerze lokalnym: utwórz oddział w wersji 1.7 (nasz inny oddział)

wersja oddziału git 1.7

Wersja git push origin 1.7

na zdalnym serwerze z repozytorium git bare:

$ cd ~ / bare_git_repository.git

$ git branch


  • wersja główna 1.7

Jak stwierdzono, następujące polecenie

git Checkout wersja 1.7

powrót

fatal: Ta operacja musi być uruchomiona w drzewie roboczym

Za pomocą następującego polecenia

git --work-tree = / var / www / myappremote Checkout version 1.7

z powodzeniem zmień aktywnie oddział

$ git branch

mistrz

  • wersja 1.7

sprawdź wyniki w następujący sposób

ll / var / www / myappremote

mam nadzieję, że to pomoże

c-narzędzia
źródło
To bardzo proste rozwiązanie zadziałało dla mnie, dzięki! Jedna uwaga: musiałem ręcznie utworzyć pusty katalog drzewa roboczego, aby polecenie wykonało się pomyślnie.
Joël Esponde
-1

Ponadto, jeśli nie masz dostępu do samego repozytorium, wykonując polecenie git remote set-head i gotowe

Zobacz poprzednią odpowiedź

dvdvck
źródło
-3

Mam też nagie repozytorium na naszym serwerze i udało mi się z powodzeniem pobrać pliki

git clone //server/repo/directory -b branch_name

do nowego lokalnego repozytorium, mimo że strona zawiera informację, że dotyczy to tylko repozytoriów innych niż zwykłe.

mcjh
źródło
1
Chociaż to, co mówisz, jest prawdą, fakt, że używasz opcji -b do wybrania konkretnej gałęzi, łamie twoją odpowiedź w kontekście mojego pytania, czyli w jaki sposób ustawiasz gałąź DOMYŚLNĄ.
kbro
-4

Porównałem dwa katalogi przed i po złożeniu wniosku

git symbolic-ref HEAD refs/heads/mybranch

i wygląda na to, że zmieniono tylko plik repo.git / HEAD, więc prawdopodobnie bezpieczne jest „zhakowanie” pliku.

boryn
źródło
2
Istnieją subtelne problemy z łamaniem, które można wprowadzić bezpośrednio edytując pliki Git ref. Zdecydowanie odradzam to. Polecenia hydrauliczne są łatwiejsze i bezpieczniejsze niż bezpośrednia edycja referencji.
Alain O'Dea,
2
Jaka jest zaleta tego @boryn?
Alex Chamberlain
2
Git śledzi w tle wiele rzeczy, takich jak historia referencji. Jeśli ręcznie zmienisz plik, nie zostanie on zalogowany. Prawdą jest, że prawdopodobnie nie będzie to miało znaczenia. Ale jeśli stracisz kontrolę nad niektórymi zatwierdzeniami i chcesz je znaleźć, będziesz szczęśliwszy, jeśli nie tylko „zhakujesz” plik.
qwerty9967
Użyłem polecenia. Ale ta odpowiedź była pomocna, aby zrozumieć, jak to działa, a częściowo, aby zrozumieć, że referencje / głowy są czymś wewnętrznym i nie powinienem tego zmieniać, tylko ostatnia część „ścieżki”. Głosowałem więc, ponieważ uważam, że mimo wszystko była to cenna informacja.
Mike Keskinov