Qual é a melhor prática para colocar vários projetos em um repositório git? [fechadas]

188

Por alguma razão, só tenho um repositório para usar.
Mas tenho vários projetos, incluindo javaprojetos php scriptse Androidaplicativos.

Agora, meu problema é que tenho que colocá-los em diferentes subpastas dentro do repositório
. Uso IDEs diferentes. Você sabe, cada IDE pode ter um espaço de trabalho por si só.

Quem pode me dizer a melhor prática para resolver o problema?

Stony
fonte
1
Uma solução possível poderia ser stackoverflow.com/questions/5514739/… ou stackoverflow.com/a/7931825/828197
Ragnarokkr
2
Você não está sozinho. Eu tenho um caso semelhante com meus repositórios que eu uso para fins de aprendizado (exemplo: github.com/hopbit/java-sandbox ). Eu não quero criar um novo repositório para tentar exemplos para cada novo livro / tutorial que eu começar a ler ...
Łukasz Siwiński
Um motivo para você querer fazer isso é se você tiver um projeto que é o código do produto que você implementa em ambientes de tempo de execução, como teste ou produção. O segundo projeto é um aplicativo que o sistema testa (BDD por exemplo) o primeiro projeto. Há um relacionamento próximo entre esses dois projetos e agora você pode manter / consultar a totalidade usando um URL de repositório.
Lance Tipo
Resumo como abaixo "O Git não tem idéia se isso faz parte do mesmo ou de projetos diferentes"
ahmednabil88 13/02/19

Respostas:

198

Enquanto a maioria das pessoas diz para você usar apenas vários repositórios, acho que vale a pena mencionar que existem outras soluções.

Solução 1

Um único repositório pode conter várias ramificações independentes , chamadas ramificações órfãs . Ramos órfãos são completamente separados um do outro; eles não compartilham histórias.

git checkout --orphan BRANCHNAME

Isso cria uma nova ramificação, não relacionada à sua ramificação atual. Cada projeto deve estar em seu próprio ramo órfão.

Agora, por qualquer motivo, o git precisa de um pouco de limpeza após um checkout órfão.

rm .git/index
rm -r *

Verifique se tudo está comprometido antes de excluir

Depois que o ramo órfão estiver limpo, você poderá usá-lo normalmente.

Solução 2

Evite todo o aborrecimento de galhos órfãos. Crie dois repositórios independentes e envie-os para o mesmo controle remoto. Basta usar nomes de ramificações diferentes para cada repositório.

# repo 1
git push origin master:master-1

# repo 2
git push origin master:master-2
Jacob Groundwater
fonte
Muito obrigado, que deve ser capaz de resolver o meu problema. Na verdade, as duas soluções usam ramificações para realizar projetos diferentes.
Stony
6
Não sei se entendi a solução 2. Você está dizendo que confirma todos os arquivos .git em um repositório mestre do git? O que há de diferente entre usar vários ramos órfãos e usar vários ramos?
Nate
14
@Nate O que ele está dizendo é o seguinte: crie dois repositórios locais separados e envie-os ao mesmo repositório remoto no GitHub.
O cara com o chapéu
1
Obrigado @TheGuywithTheElfHat. Agora que eu olho para ele novamente (9 meses depois), parece claro para mim. A solução 2 ainda está criando ramificações órfãs, mas posso ver como esse método é mais fácil de lidar.
Nate
21
Solução 2 precisa de mais explicações
eC Droid 29/11
19

Solução 3

Isto é para usar um único diretório para vários projetos. Eu uso essa técnica para alguns projetos intimamente relacionados, onde muitas vezes preciso puxar alterações de um projeto para outro. É semelhante à idéia de galhos órfãos, mas os galhos não precisam ficar órfãos. Simplesmente inicie todos os projetos no mesmo estado de diretório vazio.

Iniciar todos os projetos de um diretório vazio confirmado

Não espere maravilhas com esta solução. A meu ver, você sempre terá aborrecimentos com arquivos não rastreados. O Git realmente não tem idéia do que fazer com eles e, se houver arquivos intermediários gerados por um compilador e ignorados pelo seu arquivo .gitignore, é provável que eles permaneçam suspensos por algum tempo, se você tentar trocar rapidamente entre - por exemplo - seu projeto de software e um projeto de tese de doutorado.

No entanto, aqui está o plano. Comece como você deve iniciar qualquer projeto git, confirmando o repositório vazio e inicie todos os seus projetos no mesmo estado de diretório vazio. Dessa forma, você tem certeza de que os dois lotes de arquivos são bastante independentes. Além disso, dê um nome adequado às suas filiais e não use apenas "master" preguiçosamente. Seus projetos precisam ser separados, portanto, forneça nomes apropriados.

As confirmações do Git (e, portanto, tags e branches) basicamente armazenam o estado de um diretório e seus subdiretórios e o Git não tem idéia se são partes do mesmo ou de diferentes projetos; portanto, não há problema em o git armazenar projetos diferentes no mesmo repositório. O problema é você limpar os arquivos não rastreados de um projeto ao usar outro ou separar os projetos posteriormente.

Crie um repositório vazio

cd some_empty_directory
git init
touch .gitignore
git add .gitignore
git commit -m empty
git tag EMPTY

Comece seus projetos de vazio.

Trabalhe em um projeto.

git branch software EMPTY
git checkout software
echo "array board[8,8] of piece" > chess.prog

git add chess.prog 
git commit -m "chess program"

Iniciar outro projeto

quando você quiser.

git branch thesis EMPTY
git checkout thesis
echo "the meaning of meaning" > philosophy_doctorate.txt
git add philosophy_doctorate.txt 
git commit -m "Ph.D"

Mudar para frente e para trás

Volte e avance entre os projetos sempre que quiser. Este exemplo remonta ao projeto de software de xadrez.

git checkout software
echo "while not end_of_game do make_move()" >> chess.prog
git add chess.prog 
git commit -m "improved chess program"

Arquivos não rastreados são irritantes

No entanto, você ficará incomodado com arquivos não rastreados ao trocar entre projetos / ramificações.

touch untracked_software_file.prog
git checkout thesis 
ls
    philosophy_doctorate.txt  untracked_software_file.prog

Não é um problema intransponível

Por definição, por definição, o git realmente não sabe o que fazer com arquivos não rastreados e cabe a você lidar com eles. Você pode impedir que arquivos não rastreados sejam transportados de uma ramificação para outra da seguinte maneira.

git checkout EMPTY 
ls
    untracked_software_file.prog
rm -r *
    (directory is now really empty, apart from the repository stuff!)
git checkout thesis
ls
    philosophy_doctorate.txt

Ao garantir que o diretório estivesse vazio antes de verificar nosso novo projeto, garantimos que não houvesse arquivos não rastreados pendentes de outro projeto.

Um refinamento

$ GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01T01:01:01' git commit -m empty

Se as mesmas datas forem especificadas sempre que você confirmar um repositório vazio, as confirmações do repositório vazio criadas independentemente poderão ter o mesmo código SHA1. Isso permite que dois repositórios sejam criados independentemente e depois mesclados em uma única árvore com uma raiz comum em um repositório posteriormente.

Exemplo

# Create thesis repository. 
# Merge existing chess repository branch into it

mkdir single_repo_for_thesis_and_chess
cd single_repo_for_thesis_and_chess
git init
touch .gitignore
git add .gitignore
GIT_AUTHOR_DATE='2001-01-01:T01:01:01' GIT_COMMITTER_DATE='2001-01-01:T01:01:01' git commit -m empty
git tag EMPTY
echo "the meaning of meaning" > thesis.txt
git add thesis.txt
git commit -m "Wrote my PH.D"
git branch -m master thesis

# It's as simple as this ...
git remote add chess ../chessrepository/.git
git fetch chess chess:chess

Resultado

Diagrama de repositórios mesclados

Usar subdiretórios por projeto?

Também pode ajudar se você mantiver seus projetos em subdiretórios sempre que possível, por exemplo, em vez de ter arquivos

chess.prog
philosophy_doctorate.txt 

ter

chess/chess.prog
thesis/philosophy_doctorate.txt 

Nesse caso, seu arquivo de software não rastreado será chess/untracked_software_file.prog. Ao trabalhar no thesisdiretório, você não deve ser incomodado por arquivos de programa de xadrez não rastreados e poderá encontrar ocasiões em que poderá trabalhar feliz sem excluir arquivos não rastreados de outros projetos.

Além disso, se você deseja remover arquivos não rastreados de outros projetos, será mais rápido (e menos propenso a erros) despejar um diretório indesejado do que remover arquivos indesejados selecionando cada um deles.

Os nomes das filiais podem incluir caracteres '/'

Portanto, convém nomear seus ramos como

project1/master
project1/featureABC
project2/master
project2/featureXYZ
Ivan
fonte