Mude um HEAD remoto do Git para apontar para algo além do mestre

Como faço para definir a referência HEAD de um controle remoto do Git para apontar para algo além de “mestre”?

Meu projeto tem uma política para não usar uma ramificação “principal” (todas as ramificações devem ter nomes significativos). Além disso, o repository mestre canônico só é acessível via ssh: //, sem access ao shell (como GitHub ou Unfuddle).

Meu problema é que o repository remoto ainda tem uma referência HEAD para refs / heads / master, mas eu preciso que ele aponte para um branch diferente. Isso está causando dois problemas:

  1. Ao clonar o repo, lá isso,

    aviso: head remoto refere-se a ref inexistente, incapaz de checkout.

    Isso é confuso e inconveniente.

  2. O navegador de código baseado na web depende do HEAD como base para navegar na tree. Eu preciso que o HEAD aponte para um ramo válido, então.

    Houve quase a mesma pergunta no GitHub um ano atrás.

    A ideia era renomear o branch master:

    git branch -m master development git branch -m published master git push -f origin master 

    Tornar mestre tem o que você quer que as pessoas usem, e fazer todo o trabalho nas filiais.

    (um ” git-symbolic-ref HEAD refs/head/published ” não seria propagado para o repository remoto)

    Isso é semelhante a ” Como excluo origem / mestre no Git “.


    Como dito neste tópico : (grifo meu)

    git clone ” cria apenas um único branch local.
    Para fazer isso, ele olha para a HEAD ref do repository remoto e cria uma ramificação local com o mesmo nome da ramificação remota referenciada por ele.

    Então, para finalizar, você tem o repo A e clona:

    • HEAD referencia refs/heads/master e que existe
      -> você obtém uma ramificação local chamada master, a partir da origem / master

    • Referências HEAD refs/heads/anotherBranch e que existe
      -> você obtém um branch local chamado anotherBranch , a partir de origin/anotherBranch

    • HEAD referencia refs/heads/master e isso não existe
      -> “git clone” reclama

    Não tenho certeza se há alguma maneira de modificar diretamente o ref de HEAD em um repo .

    (qual é o ponto principal da sua pergunta, eu sei;))


    Talvez o único caminho seja uma “publicação para os pobres” , onde você:

      $ git-symbolic-ref HEAD refs/head/published $ git-update-server-info $ rsync -az .git/* server:/local_path_to/git/myRepo.git/ 

    Mas isso envolveria access de gravação ao servidor, o que nem sempre é possível.


    Como explico em ” Git: Maneira correta de alterar o Active Branch em um repository vazio? “, O git remote set-head não alteraria nada no repository remoto.

    Isso só alteraria a ramificação de rastreamento remoto armazenada localmente em seu repository local, em remotas remotes//HEAD .

    Atualização: Isso só funciona para a cópia local do repository (o “cliente”). Por favor, veja os comentários dos outros abaixo.

    Com uma versão recente do git (fevereiro de 2014), o procedimento correto seria:

    git remote set-head $REMOTE_NAME $BRANCH

    Por exemplo, a mudança da cabeça na origin remota para o develop ramificação seria:

    git remote set-head origin develop

    Já que você menciona o GitHub, para fazê-lo em seu site, simplesmente entre em seu projeto, então …

    admin > Default Branch > (choose something)

    Feito.

    Veja: http://www.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html

    Isso define o ramo padrão no repository git. Você pode executar isso em repositorys simples ou espelhados.

    USO:

    $ git symbolic-ref HEAD refs / cabeças /

    (Já havia basicamente a mesma pergunta ” crie um git symbolic ref no repository remoto “, que não recebeu resposta universal).

    Mas há respostas específicas para vários “farms” do git (onde vários usuários podem gerenciar git repos através de uma interface restrita: via http e ssh): http://Github.com , http://Gitorious.org , http: / /repo.or.cz , Girar ( http://git.altlinux.org ).

    Essas respostas específicas podem ser úteis para quem lê esta página e pensa nesses serviços específicos.

    • Agora eles têm um menu drop-down para selecionar o ramo HEAD em http://repo.or.cz (exemplo: http://repo.or.cz/editproj.cgi?name=for-me-and-for- all_imz.git );
    • e em http://gitorious.org , também (procure em algum lugar nas configurações);
    • e em http://GitHub.com : admin> Filial Padrão> (escolha algo) (graças à resposta do @ srcspider);
    • Desde a v2.6 , a ramificação padrão pode ser definida na interface da Web em ‘Projetos’> ‘Lista’>> ‘Ramificações’ . Na v2.12, o Gerrit adicionou um novo comando set-head que pode ser usado sobre o ssh .
    • e no Girar (rodando em http://git.altlinux.org para construir pacotes para a distribuição do ALT), pode-se $ ssh git.alt help | fgrep branch default-branch [] $ a interface ssh para isso: $ ssh git.alt help | fgrep branch default-branch [] $ $ ssh git.alt help | fgrep branch default-branch [] $ por exemplo ssh git.alt default-branch packages/autosshd.git sisyphus para alterar o HEAD no autosshd.git remoto autosshd.git para apontar para o ramo sisyphus .

    Se você tiver access ao repository remoto a partir de um shell, basta acessar o .git (ou o diretório principal se for um repository vazio) e alterar o arquivo HEAD para apontar para o header correto. Por exemplo, por padrão, ele sempre contém ‘refs: refs / heads / master’, mas se você precisar que o foo seja o HEAD, apenas edite o arquivo HEAD e altere o conteúdo para ‘refs: refs / heads / foo’.

    Você pode criar um branch master desanexado usando somente comandos Git de porcelana:

     git init touch GO_AWAY git add GO_AWAY git commit -m "GO AWAY - this branch is detached from reality" 

    Isso nos dá um branch master com uma mensagem grosseira (você pode querer ser mais educado). Agora nós criamos nosso ramo “real” (vamos chamá-lo de tronco em honra ao SVN) e o divorciamos do mestre :

     git checkout -b trunk git rm GO_AWAY git commit --amend --allow-empty -m "initial commit on detached trunk" 

    Ei, pronto! gitk –all mostrará master e trunk sem link entre eles.

    A “mágica” aqui é que –amend faz com que git commit crie um novo commit com o mesmo pai que o atual HEAD, então faça o HEAD apontar para ele. Mas o HEAD atual não tem um pai como é o commit inicial no repository, então o novo HEAD também não possui um, tornando-os separados uns dos outros.

    O antigo HEAD commit não é deletado pelo git-gc porque os refs / heads / master ainda apontam para ele.

    O sinalizador –allow-empty é necessário apenas porque estamos cometendo uma tree vazia. Se houvesse algum acréscimo após o git rm , não seria necessário.

    Na verdade, você pode criar uma ramificação destacada a qualquer momento, ramificando a confirmação inicial no repository, excluindo a tree, adicionando a tree desanexada e fazendo o comando git commit –amend .

    Eu sei que isso não responde à questão de como modificar a ramificação padrão no repository remoto, mas fornece uma resposta clara sobre como criar uma ramificação destacada.

    Primeiro, crie a nova ramificação que você gostaria de definir como seu padrão, por exemplo:

    $>git branch main

    Em seguida, empurre esse ramo para a origem :

    $>git push origin main

    Agora, quando você fizer login na sua conta do GitHub, poderá ir ao seu repository e escolher Configurações> Filial padrão e escolher ” principal “.

    Então, se você escolher, você pode excluir o ramo mestre:

    $>git push origin :master

    Para pessoas gitolitas, o gitolite suporta um comando chamado – espere por ele – symbolic-ref . Ele permite que você execute esse comando remotamente se você tiver permissão W (escrita) para o repo.

    Simples, faça o login na sua conta do GitHub e, no lado direito do menu de navegação, escolha Configurações , na guia Configurações, escolha Filial Padrão e volte para a página principal do seu repository que fez o truque para mim.