Configurar um projeto é fácil no git e, portanto, posso ter um repositório separado, mesmo para pequenos scripts. Agora o problema é como gerenciá-los.
Eu trabalho em vários lugares com esses repositórios. Quando eu tiver feito alterações em algum repositório, quero ser capaz de atualizar os repositórios em outros lugares.
Portanto, tenho um diretório com muitos repositórios nele.
- Como posso obter todos eles?
- Como posso verificar se algum deles tem alterações não confirmadas?
- Como posso verificar se algum deles tem alterações a serem mescladas?
E seria bom poder fazer isso com um comando.
A saída precisa ser silenciosa o suficiente para realmente notar o que fazer.
hg mercurial
.Respostas:
Eu recomendo fortemente a ferramenta de múltiplos repositórios mr . Eu costumava usar um script de shell personalizado, conforme recomendado por outros há algum tempo, mas usar o mr tem os seguintes benefícios para mim:
Com relação à sua pergunta sobre a saída silenciosa: O nível de detalhamento pode ser modificado usando a opção de linha de comando -q. Eu prefiro a saída padrão, que parece unificar bem a saída em um resumo curto e claro.
Eu uso o seguinte alias para o comando mr para garantir que mr sempre pegue minha lista de projetos padrão armazenada em $ HOME e use 5 threads paralelos:
fonte
alias pa='find . -name .git -print -execdir git pull \;'
então,pa
é o suficienteDevo dizer que comecei com a resposta atualmente aceita (apenas um monte de scripts de helpers que iteram nos repositórios), mas, de modo geral, foi uma experiência que faltou para mim.
Então, depois de tentar submódulos mr, repo e git, descobri que cada um faltava de uma maneira diferente, então, acabei fazendo minha própria variante: http://fabioz.github.io/mu-repo que é uma ferramenta madura em este ponto - tem fluxos de trabalho que permitem a você:
Observe que ele é compatível com qualquer sistema operacional em que Python seja executado;
fonte
mu sh <some command>
executar alguns comandos arbitrários em repositórios múltiplos, toda a sua finalidade é lidar com git e não com outros sistemas de controle de versão. .se precisar disso, então sim, use uma ferramenta diferente.gr (git-run) estendea funcionalidade de mr (somente para
git
). Acho mais fácil organizar vários repositórios git usando seu sistema de tag. O código paragr
não é bem mantido. Se você estiver usando o bash, certifique-se de usá-lo com o em-t tag
vez do#tag
formulário.fonte
Você pode tentar usar o repo com um
manifest.xml
arquivo personalizado para especificar onde estão seus repositórios. Existe alguma documentação sobre como fazer isso.Alternativamente, você pode usar
git-submodule(1
) .fonte
Eu escrevi uma ferramenta chamada " RepoZ " que descobre automaticamente os repositórios git assim que você os clona ou altera qualquer coisa neles, como trocar um branch, por exemplo.
Uma vez encontrados, os repositórios são "rastreados". Isso simplesmente os mostrará em uma lista de repositórios locais, incluindo uma densa informação de status inspirada no posh-git . Ele contém o branch atual e outras coisas como edições de arquivo e a contagem de commits de entrada ou saída.
Isso ajuda a manter o controle de seus repositórios locais e trabalho inacabado para confirmar ou enviar. Além disso, você pode usar a lista de repositórios como navegação para alternar de um repositório para outro.
"Como posso buscar todos eles?"
A versão para Windows oferece um menu de contexto para buscar ou puxar um repositório. Com a seleção múltipla, você pode executar ações em vários repositórios de uma vez.
No entanto, você pode achar outro recurso muito útil:
Com a busca automática, você pode dizer ao RepoZ para buscar os remotos de todos os seus repositórios git periodicamente em segundo plano. Essas buscas não irão colidir com seus commits locais, é claro. Não há tentativas de mesclagem local como com
git pull
.fonte
gitslave é uma ferramenta que pode executar o mesmo comando em muitos repositórios, criando uma relação superprojeto / subprojeto entre o super e os subs. Isso (por padrão) fornece um resumo de saída para que você possa se concentrar nos repositórios que fornecem uma saída única (útil para o status git, não tão útil para os arquivos-ls git).
Isso normalmente é usado para projetos em que você precisa montar vários repositórios juntos e mantê-los no mesmo branch ou tag ao mesmo tempo ou o que for. Para meu diretório de repositórios (vazios), só tenho um pequeno makefile que me permite executar comandos git arbitrários, que, como você pode ver, uso principalmente para fsck e gc:
fonte
Fiz um alias e uma função para executar qualquer comando git em todos os repositórios disponíveis em um diretório (recursivamente). Você pode encontrá-lo aqui: https://github.com/jaguililla/dotfiles/git
Este é o código:
Espero que ajude :)
fonte
.bash_aliases
:alias rgit='function _rgit(){ find . -type d -name .git -printf "\n%p\n" -execdir git "$@" \;; }; _rgit'
. Fonte-o, por exemplo, liguergit status
.Você pode usar a
git-status-all
gema para isso: https://github.com/reednj/git-status-allTambém há uma opção de busca que buscará na origem para todos os repositórios antes de exibir o status:
fonte
find . -name .git -print -execdir git status \;
está OKEu uso este script para executar comandos git facilmente em todos os meus repositórios.
Por padrão, o script procurará por repositórios git em ~ / cm / src, mas você pode sobrescrever isso configurando a variável de ambiente GITREPO de sua preferência.
Este script é baseado neste script .
fonte
find . -name .git -print -execdir git pull \;
faz o que você pensa.Eu escrevi uma ferramenta de linha de comando chamada gita para gerenciar vários repositórios. Mostra o status dos repositórios registrados lado a lado, por exemplo
Ele também pode delegar comandos / aliases git de qualquer diretório de trabalho.
Agora, para responder às suas perguntas usando esta ferramenta:
O
gita ls
comando mostra 3 símbolos possíveis ao lado do nome do ramo, o que indica+
: mudanças encenadas*
: mudanças não planejadas_
: arquivos / pastas não rastreadosOs nomes dos ramos são coloridos de 5 maneiras
Para instalá-lo, basta executar
fonte
Se alguém ainda está olhando para este tópico, verifique meu script de shell chamado gitme
você precisará inserir manualmente seus repositórios git locais, mas eu uso essa ferramenta todos os dias para colaborar com vários projetos git em vários computadores.
você pode correr
git clone https://github.com/robbenz/gitme.git
também o script é postado abaixo
Eu configurei um alias no meu ~ / .bash_profile para
alias gitme='sh /path/to/gitme.sh'
fonte
Você deve verificar o rgit no CPAN, que executa recursivamente comandos git em todos os repositórios em uma árvore de diretório.
Dos documentos:
fonte
Acabei de criar uma ferramenta que faz o que você quiser!
gmaster fetch
gmaster status
gmaster status
Chama-se gitmaster: https://github.com/francoiscabrol/gitmaster
fonte
Escrevi esta função bash simples em meu .bash_profile para poder executar git, maven, gradle ou qualquer outro comando bash apenas em todos os repositórios git:
Isso pode ser usado desta forma
fonte
Isenção de responsabilidade: estou trabalhando nesta ferramenta em www.repoflow.com
Estou trabalhando nisso, mas também resolvendo as questões de OP e ajudando a gerenciar vários repositórios em geral. Você pode usar a IU ou a API GraphQL subjacente para criar seus próprios scripts, considere-o como outra opção.
fonte
Existe uma ferramenta útil para buscar todos os repositórios múltiplos.
git-pull-all
é uma ferramenta de linha de comando para executar em vários repositórios git de forma assíncrona.Instalação
Uso
Suponha que você tenha estes arquivos e diretórios:
Quando você executa o
git-pull-all
comando no~/Projects
diretório, ele deve encontrar repositórios git filhos (no caso acima cool-examples e super-express ) e depois executargit pull
em cada um deles.Link do GitHub: https://github.com/tatsuyaoiw/git-pull-all
fonte
Eu uso o código do Visual Studio. Temos cerca de 20 bibliotecas em nossa base de código que são todos repositórios Git separados, e a guia de controle de origem no Visual Studio Code é muito boa para ver uma visão "rápida" de quão atrasados ou adiantados os repositórios locais estão. Existem também configurações para buscar periodicamente para manter essas informações atualizadas, bem como um botão de atualização.
Não é tão conveniente quanto um script, mas quando se trata de controle de origem para mim, gosto de fazer as alterações. É necessário um script muito bem escrito para ter cuidado para não sobrescrever as alterações, etc. Com a abordagem do VS Code, você obtém uma boa quantidade de informações rapidamente para que possa agir por conta própria.
Aqui está uma captura de tela de sua aparência:
fonte
Eu encontrei uma ótima solução para extrair do branch atual de todos os subdiretórios que têm uma pasta .git, mesmo se cada repositório tiver um branch diferente verificado. O comando é de uma linha, flexível o suficiente para ser modificado para diferentes comandos git e pode ter um alias.
Basta copiar e colar o seguinte:
Dividindo:
Encontre todos os diretórios (-type d) no diretório atual (find.) Que têm o nome ".git" (-name .git), procurando no máximo dois diretórios de profundidade (2 em vez de 1 porque estamos procurando o pasta git dentro da pasta repo git).
Execute o seguinte comando shell (exec sh -c)
Mude o diretório para o primeiro argumento (cd $ 0), então mude o diretório um nível acima para deixar a pasta .git (cd ..) então faça git pull origin enquanto especifica o branch executando git rev-parse ... para o branch atual Confirmar HEAD.
O "{}" é o caminho relativo do resultado que obtemos do comando find inicial . O ; é usado para encerrar o comando.
Testado em MacOS 10.14.6 em zsh. No estado em que se encontra, funciona apenas quando as filiais remotas e locais têm o mesmo nome, AFAIK.
Você pode modificar isso para obter o status. Espero que você possa adicionar argumentos para tornar isso mais flexível, mas ainda não tentei.
fonte
Eu uso o recurso de seleção de vários cursores / edição de várias linhas do meu editor de código (código VS) para criar script em lote / shell e executá-lo de uma vez. Com esta solução simples e estúpida, eu sei o que estou fazendo e o que posso esperar da execução desses comandos. Sem adivinhação, sem aprendizagem, sem necessidade de personalização. Outro motivo é que sempre que desejo executar comandos em conjuntos diferentes de repositórios que residem em um diretório pai comum.
fonte
https://github.com/wwjamieson3/envisionTools tem um script bash chamado gitstat que faz isso e muito mais. É compatível com GNU e mac. Ele pode realizar buscas de controles remotos, se solicitado. Mostra arquivos não rastreados, modificados, adicionados, excluídos e testados. Ele se diferencia dos remotos ao mostrar commits não mesclados em remotos e commits locais não enviados. Ele também pode exibir resultados codificados por cores em modo resumido ou detalhado e até mesmo HTML. Ele usa localizar em vez de localizar porque é infinitamente mais rápido e até solicitará a atualização do banco de dados de localização se estiver ficando muito antigo.
fonte
Parece que escrever um script para fazer isso é muito fácil. Essencialmente, ele precisa iterar nos repositórios e então usar comandos como git ls-files, git diff e git log.
fonte