Criando uma nova ramificação vazia para um novo projeto

351

Estamos usando um repositório git para armazenar nosso projeto. Temos nossas filiais partindo da filial original. Mas agora queremos criar um novo projeto pequeno para rastrear alguma documentação. Para isso, gostaríamos de criar uma nova ramificação vazia para começar a armazenar nossos arquivos, e eu gostaria que outros usuários da rede clonassem essa ramificação.

Como podemos fazer isso?

Eu tentei algumas coisas, mas elas não funcionaram.

$ mkdir proj_doc; cd proj_doc
$ git init
$ git add .
$ git commit -m 'first commit'
$ git br proj_doc
$ git co proj_doc
$ git br -d master
$ git push origin proj_doc

Parece empurrar a ramificação ok, mas quando faço uma busca ou extração, ele baixa informações de outras ramificações e, em seguida, também recebo alguns arquivos extras de outros projetos. Qual a melhor solução?

fazineroso
fonte
11
Por que você precisa armazenar isso em uma filial? Ramos são geralmente para alguns desvios da mesma base de código. Talvez apenas iniciar um novo repositório seja uma solução melhor.
Benjamin Bannier
2
Bem, nós fizemos isso antes, IIRC, e eu gostaria de fazê-lo novamente, por isso estou curioso;)
fazineroso
3
"for a new project" - Como @honk, sugiro colocar isso em um novo repositório. Duas opções de lá para integrá-las. Faça um submoduleno projeto original, por exemplo, docs/apontando para o outro repositório. Ou, se você deseja mesclar o código posteriormente, adicione-o como um controle remoto.
gertvdijk
11
Uma desvantagem adicional da abordagem órfã é que você precisa manter seus .gitignorearquivos e também alternar constantemente entre as duas raízes (ramificações). Então, eu também sou a nova abordagem de repo, em uma nova pasta, com os mesmos controles remotos e empurrando para outro ramo.
simo

Respostas:

666

Você pode criar uma ramificação como órfã:

git checkout --orphan <branchname>

Isso criará um novo ramo sem pais. Em seguida, você pode limpar o diretório de trabalho com:

git rm --cached -r .

e adicione os arquivos de documentação, confirme-os e envie-os ao github.

Um puxar ou buscar sempre atualizará as informações locais sobre todas as ramificações remotas. Se você deseja extrair / buscar apenas as informações de uma única ramificação remota, é necessário especificá-las.

Hiery Nomus
fonte
18
Boa resposta, mas é meio irritante que o novo ramo comece com todos os arquivos (do ramo anterior) organizados.
Matt Fenwick
12
Ao emitir git checkout --orphan <branch>; Não vejo nenhuma listagem de <branch> no git branch.
Santosh Kumar
51
Depois git checkout --orphanpode-se usar git reset --hardpara excluir os arquivos que sobraram.
Ilya Kozhevnikov 31/03
16
A razão pela qual você não vê a ramificação depois git checkout --orphan <branch>é porque ela ainda não tem nenhum commit. Após a primeira confirmação, git branchimprime a nova ramificação.
Krøllebølle 07/04
13
O git clean -fd remove arquivos não rastreados.
22417 stefgosselin
71

A resposta correta é criar um ramo órfão. Explico como fazer isso em detalhes no meu blog. (Link arquivado)

...

Antes de iniciar, atualize para a versão mais recente do GIT. Para garantir que você esteja executando a versão mais recente, execute

which git

Se houver uma versão antiga, talvez seja necessário aumentar o seu PATH com a pasta que contém a versão que você acabou de instalar.

Ok, estamos prontos. Depois de gravar um CD na pasta que contém seu git checkout, crie um ramo órfão. Neste exemplo, vou nomear o ramo "mybranch".

git checkout --orphan mybranch

Excluir tudo no ramo órfão

git rm -rf .

Faça algumas alterações

vi README.txt

Adicione e confirme as alterações

git add README.txt
git commit -m "Adding readme file"

É isso aí. Se você correr

git log

você notará que o histórico de consolidação começa do zero. Para voltar ao seu ramo principal, basta executar

git checkout master

Você pode retornar ao ramo órfão executando

git checkout mybranch
Sid Jain
fonte
16
Respostas somente para links não são incentivadas. Se o link for movido ou removido, sua resposta se tornará inútil. Considere adicionar partes essenciais diretamente a essa resposta. Preste atenção especial às questões não abordadas com respostas anteriores.
Bytebuster
3
Infelizmente, o link não é mais válido.
Alexey #
11
Arquivos são uma coisa maravilhosa.
Lucid_dreamer 13/08/19
3
É PERIGOSO apenas remover tudo do diretório de trabalho, porque qualquer projeto não trivial terá arquivos não rastreados (configuração, ambiente, cache, etc.).
Slava Fomin II
12

Faça um novo ramo vazio como este:

true | git mktree | xargs git commit-tree | xargs git branch proj-doc

Se seus arquivos do proj-doc já estiverem em uma confirmação em um único subdiretório, você poderá criar a nova ramificação desta maneira:

git commit-tree thatcommit:path/to/dir | xargs git branch proj-doc

que pode ser mais conveniente do que git branch --orphanse isso iria deixá-lo com um monte de git rme git mving a fazer.

Tentar

git branch --set-upstream proj-doc origin/proj-doc

e veja se isso ajuda no seu problema de buscar demais. Além disso, se você realmente deseja apenas buscar uma única ramificação, é mais seguro apenas especificá-la na linha de comando.

jthill
fonte
11
Essa resposta é interessante porque permite iniciar outra ramificação / raiz com o primeiro commit totalmente vazio.
Stéphane Gourichon
Outra maneira de fazer uma ramificação vazia se você não se importa de mudar para ele égit checkout --orphan new-branch; git reset --hard
jthill
Qual é a utilidade do xargs?
Flux
O @Flux é apenas outra maneira de obter o ID da árvore como um argumento de árvore de confirmação.
jthill 16/01
Eu realmente gosto dessa abordagem, pois isso permite criar uma nova ramificação vazia, sem sair da ramificação atual, além do fato de haver uma confirmação vazia como ponto de partida.
Brice
8

Se sua versão git não possui a opção --orphan, este método deve ser usado:

git symbolic-ref HEAD refs/heads/<newbranch> 
rm .git/index 
git clean -fdx 

Depois de fazer algum trabalho:

git add -A
git commit -m <message>
git push origin <newbranch>
cyb0k
fonte
2
Tenha cuidado, git cleanpode excluir arquivos que você não deseja excluir! Execute git clean -ndxprimeiro para ver quais arquivos serão excluídos antes de executá-lo de verdade com a -fopção
Lassi
7

Digamos que você tenha uma masterramificação com arquivos / diretórios:

> git branch  
master
> ls -la # (files and dirs which you may keep in master)
.git
directory1
directory2
file_1
..
file_n

Passo a passo como fazer um ramo vazio:

  1. git checkout —orphan new_branch_name
  2. Verifique se você está no diretório certo antes de executar o seguinte comando:
    ls -la |awk '{print $9}' |grep -v git |xargs -I _ rm -rf ./_
  3. git rm -rf .
  4. touch new_file
  5. git add new_file
  6. git commit -m 'added first file in the new branch'
  7. git push origin new_branch_name

Na etapa 2, simplesmente removemos todos os arquivos localmente para evitar confusão com os arquivos em sua nova ramificação e aqueles que você mantém na masterramificação. Em seguida, desvinculamos todos esses arquivos na etapa 3. Finalmente, a etapa 4 e depois estão trabalhando com nosso novo ramo vazio.

Quando terminar, você pode alternar facilmente entre seus ramos:

git checkout master 
git checkout new_branch
user1723157
fonte
1

Com base nesta resposta do Hiery Nomus .

Você pode criar uma ramificação como órfã:

git checkout --orphan <branchname>

Isso criará um novo ramo sem pais. Em seguida, você pode limpar o diretório de trabalho com:

git rm --cached -r .

E então você apenas confirma o branch com o commit vazio e empurra

git commit -m <commit message> --allow-empty
git push origin <newbranch>
Forro
fonte
1

Confira esta documentação , possui detalhes claros sobre

--orphan <new_branch>
Crie um novo ramo órfão chamado <new_branch>, iniciado <start_point>e alterne para ele. O primeiro commit feito neste novo ramo não terá pais e será a raiz de uma nova história totalmente desconectada de todos os outros ramos e commit.

O índice e a árvore de trabalho são ajustados como se você já tivesse executado o git checkout. Isso permite que você inicie um novo histórico que registra um conjunto de caminhos semelhantes ao executar facilmente o git commit -a para fazer o root confirmar.

Kamal Hossain
fonte
11
Um link para uma solução é bem-vindo, mas garanta que sua resposta seja útil sem ela: adicione contexto ao link para que seus colegas usuários tenham uma idéia do que é e por que está lá, depois cite a parte mais relevante da página que você ' reencaminhando para o caso de a página de destino estar indisponível. Respostas que são pouco mais que um link podem ser excluídas.
Yunnosch 25/01
1

Encontrei esta ajuda:

git checkout --orphan empty.branch.name
git rm --cached -r .
echo "init empty branch" > README.md
git add README.md
git commit -m "init empty branch"
齐 化 恒
fonte