Git: maneira correta de alterar o Active Branch em um repositório vazio?

195

Eu tenho um repositório vazio que é usado como o repositório central do meu projeto. Todos os desenvolvedores fazem git clone <repo>para compartilhar com ele. Quando eles fazem o clone, eles obtêm uma verificação geral do ramo mestre (a menos que o façam git clone -n) porque o repo.git/HEADcontém ref: refs/heads/master, tornando este o ramo ativo .

A questão é: como altero o ramo ativo corretamente? Eu poderia simplesmente hackear o repo.git/HEADarquivo diretamente, mas isso parece desagradável e, bem, hacky.

Tentei fazer git checkout <otherbranch>no .gitdiretório repo , mas isso falhou porque não estava em uma árvore de trabalho.

Eu tentei, git update-ref HEAD refs/heads/otherbranchmas apenas atualizei refs / heads / master para ser o mesmo que refs / heads / otherbranch (ok, eu fiz isso em um repositório fictício, não na minha produção!)

Eu tentei git update-ref --no-deref HEAD refs/heads/otherbranche isso quase funcionou. Ele atualizou o HEADarquivo, mas o definiu como o SHA1 do commit apontado por refs/heads/otherbranch.

Estou testando com a versão git 1.7.0.2.msysgit.0.

Suponho que não há como fazer isso git push, pois permitir que todos alterem sua ramificação padrão parece um pouco inseguro (!), Mas certamente há uma maneira melhor de fazer isso no .gitdiretório repo do que invadir diretamente o HEADarquivo.

kbro
fonte
Na IMO, você está basicamente tentando fazer a coisa errada aqui. Se você deseja que a ramificação padrão seja algo diferente de mestre, essa ramificação precisa ser o mestre. Como alternativa, use dois repositórios diferentes.
Nicholas Knight
12
Como isso está fundamentalmente tentando fazer a coisa errada aqui? Um repositório simples suporta várias ramificações. Eu uso um repositório vazio como backup para o meu repositório local e, como tal, espelha as ramificações. Eu tenho um mestre em ambos e um ramo de desenvolvimento em ambos. Se eu quiser ver o log da ramificação de desenvolvimento no repositório vazio, tenho que hackear arquivos - parece que o git está fundamentalmente errado aqui em relação ao suporte ao repositório vazio.
Cthutu
15
@NicholasKnight IMHO você está errado aqui. Não há nada de especial em "master" como um nome de filial, é apenas um padrão. Nos repositórios que mantemos, não temos uma filial principal, pois "mestre" não tem significado para a empresa. Sempre que fazemos uma liberação, criamos uma nova ramificação de manutenção com o novo número da liberação e a atribuímos como a ramificação ativa.
Spacemoose
@NicholasKnight Embora eu aprecie de onde você vem, este é o primeiro SO Q / A que me disse como mudar para mestre! Eu tive meu repo inicial em um ramo de recurso quando fiz meu clone nu, e os clones subseqüentes desse repo nu foram padronizados para esse ramo em vez de mestre.
Warbo
1
Uau - esta pergunta continua e continua - é o meu apontador número 1 de reputação! A questão do "mestre" é que é apenas um nome e, se não faz sentido para sua organização, equipe, projeto, fase, o que for, escolha algo que seja apropriado para que, quando os colaboradores clonarem seu repositório, eles mudem imediatamente à filial em que você, como Gerenciador de Configurações, deseja que eles estejam. Eu costumava trabalhar com o ClearCase (bletch!), Então suas escolhas eram "main", "main" ou "main". Yuk.
kbro

Respostas:

279

Se você tiver acesso ao repositório remoto remoto, este artigo sugere :

git symbolic-ref HEAD refs/heads/mybranch

O que atualizará o arquivo HEAD no seu repositório para que ele contenha:

ref: refs/heads/mybranch

conforme documentado no git-symbolic-ref


Se você não tem acesso ao repositório remoto, veja minha resposta anterior .


Lembre-se de que um comando como git remote set-head:

  • não altera a ramificação padrão do repositório remoto .
    Ele altera apenas uma filial de rastreamento remoto armazenada no seu repositório local comorefs/remotes/<name>/HEAD

  • não muda a HEADsi próprio (novamente, apenas refs/remotes/<name>/HEAD), daí a necessidade git symbolic-ref.

Portanto, git remote set-head não é a resposta aqui.
git symbolic-ref HEADou seja, se você tiver acesso direto ao repositório remoto.

VonC
fonte
3
Obrigado! Eu tenho acesso direto ao repositório remoto remoto, para que o git-symbolic-ref faça o trabalho. Mas eu gosto do truque que não é ancestral comum mencionado no outro segmento - definitivamente um para a gaveta de baixo. Passei anos pesquisando no Google sobre isso, mas não consegui encontrar sua resposta anterior, mas o "git remote head master" o encontra como o segundo hit de classificação mais alta, logo abaixo do git-remote (1). Bizarro. Isso mostra como é difícil encontrar algo quando você não sabe exatamente o que está procurando.
Kr 22/07
git symbolic-ref HEAD refs/heads/mybranchfuncionou muito bem para mim! OBRIGADO! ;)
vinzenzweber 26/03
1
Eu realmente aprecio essa pergunta, porque acidentalmente fiz check-out de um ramo diferente do master e agora tive que corrigir isso.
Jonny Melhor
Isso não funciona para mim. Estranhamente, mesmo que o HEAD remoto no repositório simples agora mostre a ramificação correta, o git STILL me padroniza para uma ramificação diferente quando eu clono dela!
Magnus
@ Magnus, que seria uma boa pergunta para perguntar em uma nova página.
VonC 12/11/14
3

Para alterar a ramificação, você precisa alterar a referência HEAD para a ramificação que deseja usar.

Primeiro liste todas as referências no repositório bare, executando

$find ref

Em seguida, encontre a referência para sua filial, o formato será o seguinte refs/heads/<my_branch>. Portanto, o próximo passo é verificar a referência atual, basta digitar:

$git symbolic-ref HEAD

para saber qual é o ramo atual, atualize-o conforme necessário.

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

Thant é isso. Aproveitar.

Saul Rosales
fonte
2

Como alterar o ramo ativo corretamente?

  • status: git checkout no diretório repo .git retorna fatal: Esta operação deve ser executada em uma árvore de trabalho

  • dicas: basta adicionar o argumento --work-tree

exemplo detalhado: suposições: bare git no servidor remoto:

~ / bare_git_repository.git árvore de trabalho desanexada: / var / www / myappremote

no servidor local: crie a versão da filial.1.7 (nossa outra ramificação)

git branch version.1.7

git push origin version.1.7

no servidor remoto com repositório git bare:

$ cd ~ / bare_git_repository.git

Ramo $ git

  • master
    version.1.7

Conforme indicado, após o comando

git checkout version.1.7

Retorna

fatal: Esta operação deve ser executada em uma árvore de trabalho

Usando o seguinte comando

git --work-tree = / var / www / myappremote checkout versão.1.7

alterar com êxito a ramificação ativa

Ramo $ git

mestre

  • version.1.7

verifique os resultados com o seguinte

ll / var / www / myappremote

espero que ajude

c-tools
fonte
Esta solução muito simples funcionou para mim, obrigado! Uma observação: eu tive que criar um diretório vazio da árvore de trabalho manualmente para que o comando fosse executado com êxito.
Joël Esponde 02/01
-1

Além disso, se você não tiver acesso ao repositório vazio, faça um git remote set-heade estará pronto

Veja esta resposta anterior

dvdvck
fonte
-3

Também tenho um repositório simples em nosso servidor e consegui recuperar arquivos usando

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

em um novo repositório local, mesmo que a página de manual diga que isso é apenas para repositórios não vazios.

mcjh
fonte
1
Enquanto o que você diz é verdade, o fato de você estar usando -b para selecionar um ramo específico interrompe sua resposta no contexto da minha pergunta, que é como você define o ramo PADRÃO.
Kd
-4

Comparei dois diretórios antes e depois de aplicar

git symbolic-ref HEAD refs/heads/mybranch

e parece que apenas o arquivo repo.git / HEAD foi alterado, provavelmente é bastante seguro "hackear" o arquivo.

boryn
fonte
2
Existem problemas sutis de quebra que podem ser introduzidos editando diretamente os arquivos ref do Git. Eu recomendo contra isso. Os comandos de encanamento são mais fáceis e seguros do que editar diretamente as referências.
Alain O'Dea
2
Qual é a vantagem deste @boryn?
Alex Chamberlain
2
O Git mantém o controle de muitas coisas em segundo plano, como uma história de árbitros. Se você alterar manualmente o arquivo, ele não será registrado. É verdade que provavelmente não importa. Mas se você perder o controle de alguns commits e quiser encontrá-los, ficará mais feliz se não apenas "hackear" o arquivo.
Qwerty9967
Eu usei o comando. Mas essa resposta foi útil para entender como funciona e, em particular, para entender que refs / heads é algo interno e não devo alterá-lo, apenas a última parte do "caminho". Então, votei porque acho que era uma informação valiosa, afinal.
Mike Keskinov