Fiquei me perguntando se existe uma boa solução "git export" que crie uma cópia de uma árvore sem o .git
diretório do repositório. Existem pelo menos três métodos que conheço:
git clone
seguido pela remoção do.git
diretório do repositório.git checkout-index
alude a essa funcionalidade, mas começa com "Basta ler a árvore desejada no índice ...", o que não sei ao certo como fazer.git-export
é um script de terceiros que essencialmente faz umgit clone
em um local temporário seguido pelorsync --exclude='.git'
destino final.
Nenhuma dessas soluções realmente me parece satisfatória. O mais próximo svn export
pode ser a opção 1, porque ambos exigem que o diretório de destino esteja vazio primeiro. Mas a opção 2 parece ainda melhor, supondo que eu possa descobrir o que significa ler uma árvore no índice.
git
export
git-archive
svn-export
Greg Hewgill
fonte
fonte
git archive --format zip --output "output.zip" master -0
fornecerá um arquivo descompactado (-0 é o sinalizador para descompactado). git-scm.com/docs/git-archive .export
um subdiretório de 250 kB diretamente do repositório remoto (que poderia ter 200 MB de tamanho, excluindo revisões) - e atingirei a rede apenas para transferência de download de 250 kB (mais ou menos). Comgit
,archive
deve estar ativado no servidor (por isso não posso experimentá-lo) - oclone --depth 1
servidor ainda pode recuperar um repositório de, digamos, 25 MB, onde a.git
subpasta sozinha ocupa 15 MB. Portanto, eu ainda diria que a resposta é "não".git checkout-index
git archive -o latest.zip HEAD
Respostas:
Provavelmente, a maneira mais simples de conseguir isso é com
git archive
. Se você realmente precisa apenas da árvore expandida, pode fazer algo assim.Na maioria das vezes eu preciso 'exportar' algo do git, eu quero um arquivo compactado em qualquer caso, então faço algo assim.
Arquivo ZIP:
git help archive
para mais detalhes, é bastante flexível.Esteja ciente de que, embora o arquivo morto não contenha o diretório .git, ele conterá outros arquivos específicos do git ocultos, como .gitignore, .gitattributes, etc. Se você não os quiser no arquivo, certifique-se de use o atributo export-ignore em um arquivo .gitattributes e confirme isso antes de fazer seu archive. Consulte Mais informação...
Nota: Se você estiver interessado em exportar o índice, o comando é
(Veja a resposta de Greg para mais detalhes)
fonte
git archive --format zip --output /full/path master
git archive --format zip --output /path/to/file.zip --prefix=newdir/ master
a saída, será chamada 'file.zip', mas quando descompactar, o diretório de nível superior será 'newdir'. (Se você omitir o atributo prefix, a dir nível superior seria 'arquivo'.)git archive -o latest.zip HEAD
ele cria um arquivo Zip que contém o conteúdo da confirmação mais recente na ramificação atual. Observe que o formato de saída é inferido pela extensão do arquivo de saída.Eu descobri o que a opção 2 significa. Em um repositório, você pode fazer:
A barra no final do caminho é importante, caso contrário, os arquivos estarão no / destino com um prefixo de 'caminho'.
Como em uma situação normal, o índice contém o conteúdo do repositório, não há nada de especial a fazer para "ler a árvore desejada no índice". Já está lá.
O
-a
sinalizador é necessário para verificar todos os arquivos no índice (não sei o que significa omitir esse sinalizador nessa situação, pois ele não faz o que eu quero). O-f
sinalizador força a substituição de arquivos existentes na saída, o que esse comando normalmente não faz.Esse parece ser o tipo de "exportação de git" que eu estava procurando.
fonte
git add
comando altera o conteúdo no índice, portanto, o quegit status
aparecer como "a ser confirmado" são as diferenças entre HEAD e o conteúdo do índice.~
(não'~'
!) Será criado no seu diretório de trabalho. Não há nada de especial agit checkout-index
esse respeito: o mesmo é verdademkdir '~/dest'
( não faça isso! ). No entanto, outro bom motivo para nomes de arquivos evitar que precisam citando (por exemplo, que têm um espaço neles) :-)git archive
também funciona com repositório remoto.Para exportar um caminho específico dentro do repositório, adicione quantos caminhos você desejar como último argumento para o git, por exemplo:
fonte
git archive --format=tar --prefix=PROJECT_NAME/ --remote=USER@SERVER:PROJECT_NAME.git master | tar -xf -
(garante o seu arquivo está em uma pasta)git archive --format=zip --output foo.zip --remote=https://github.com/xxx.git master
e fui fatal: operação não suportada pelo protocolo. Fim inesperado do fluxo de comandos.curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -
por docsUma resposta de caso especial se o repositório estiver hospedado no GitHub.
Basta usar
svn export
.Tanto quanto sei, o Github não permite
archive --remote
. Embora o GitHub seja compatível com svn e eles tenham todos os repositórios gitsvn
acessíveis, você pode usarsvn export
como faria normalmente com alguns ajustes no seu URL do GitHub.Por exemplo, para exportar um repositório inteiro, observe como
trunk
o URL substituimaster
(ou o que a ramificação HEAD do projeto está configurada ):E você pode exportar um único arquivo ou mesmo um determinado caminho ou pasta:
Exemplo com a biblioteca JavaScript jQuery
A
HEAD
filial ou filial principal estará disponível usandotrunk
:As não
HEAD
filiais estarão acessíveis em/branches/
:Todas as tags abaixo
/tags/
da mesma maneira:fonte
git archive
funciona bem com o GitHub, desde que você use o protocolo git, basta substituirhttps://
porgit://
no URL. Não sei por que o GitHub não anuncia esse recurso oculto.fatal: The remote end hung up unexpectedly
. Tentei em dois servidores diferentes com o repositório jQuery github.git config url.<base>.insteadOf
para armazenar em cache o repositório remoto. Eu estava, portanto, usando umafile://
URL na realidade. Duvido que issogit archive
possa funcionar comgit://
URLs, pois ele precisa ser executadogit-upload-archive
no final remoto. Deve ser possível usar ossh
protocolo, exceto que o github não permite (Invalid command: 'git-upload-archive'
).No manual do Git :
Usando o git-checkout-index para "exportar uma árvore inteira"
A capacidade do prefixo basicamente torna trivial o uso do git-checkout-index como uma função "exportar como árvore". Basta ler a árvore desejada no índice e fazer:
$ git checkout-index --prefix=git-export-dir/ -a
fonte
git read-tree bar:foo
E entãogit checkout-index --prefix=export_dir/ -a
depois disso talvez você deve fazergit update-index master
Eu escrevi um invólucro simples
git-checkout-index
que você pode usar assim:Se o diretório de destino já existir, você precisará adicionar
-f
ou--force
.A instalação é simples; basta soltar o script em algum lugar no seu
PATH
e verifique se ele é executável.O repositório do github para
git-export
fonte
Parece que este é um problema menor no Git que no SVN. O Git coloca apenas uma pasta .git na raiz do repositório, enquanto o SVN coloca uma pasta .svn em todos os subdiretórios. Portanto, "svn export" evita a magia recursiva da linha de comando, enquanto que com o Git a recursão não é necessária.
fonte
O equivalente a
dentro de um repo existente é
O equivalente a
é
fonte
git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)
... No entanto, o arquivamento com carimbos de data e hora não é exatamente trivial, por isso postei um exemplo abaixo .git archive branchname | tar xC otherpath
C
opção de tar é apenas GNU Tar.Se você não estiver excluindo arquivos com
.gitattributes
export-ignore
, tentegit checkout
e
Além disso, você pode obter qualquer ramificação ou etiqueta ou de uma revisão de confirmação específica, como no SVN, apenas adicionando o SHA1 (SHA1 no Git é o equivalente ao número da revisão no SVN)
Ele
/path/to/checkout/
deve estar vazio, o Git não excluirá nenhum arquivo, mas substituirá os arquivos com o mesmo nome sem nenhum avisoATUALIZAÇÃO: para evitar o problema decapitado ou deixar intacto o repositório de trabalho ao usar o checkout para exportar com tags, branches ou SHA1, é necessário adicionar
-- ./
no finalO traço duplo
--
informa ao git que tudo após os traços são caminhos ou arquivos, e também neste caso dizgit checkout
para não alterar oHEAD
Exemplos:
Este comando obterá apenas o diretório libs e também o
readme.txt
arquivo que confirma exatamenteIsso criará (substituirá)
my_file_2_behind_HEAD.txt
dois commits atrás da cabeçaHEAD^2
Para obter a exportação de outra filial
Observe que
./
é relativo à raiz do repositóriofonte
Eu uso os submódulos git extensivamente. Este funciona para mim:
fonte
.htaccess
?rsync
lista o argumento como--cvs-exclude
. Além disso, ele ainda copia.gitattributes
e.gitignore
Acessei esta página frequentemente ao procurar uma maneira de exportar um repositório git. Minha resposta a esta pergunta considera três propriedades que o svn export possui por design em comparação com o git, pois o svn segue uma abordagem de repositório centralizado:
A exportação de um determinado ramo usando svn é realizada especificando o caminho apropriado
Ao criar uma certa versão, é útil clonar uma ramificação estável como por exemplo
--branch stable
ou--branch release/0.9
.fonte
git archive | tar
abordagem não é aplicável a ambientes shell incompatíveis com POSIX (por exemplo, IC baseado em CMD ou PowerShell do AppVeyor), o que não é ideal. Agit checkout
abordagem modifica o índice da árvore principal de trabalho, o que é terrível. Agit checkout-index
abordagem requer que o índice da árvore principal de trabalho seja modificado antecipadamente, o que é ainda mais terrível. Agit clone
abordagem tradicional clona a totalidade do histórico do repositório antes de excluir esse histórico, o que é um desperdício. Essa é a única solução sadia que resta.file://
protocolo (por exemplo,git clone --depth 1 --branch v3.14.15 file:///home/me/src_repo trg_repo
). Não fazer isso emitirá"warning: --depth is ignored in local clones; use file:// instead."
e executará um clone padrão em vez de superficial, derrotando todo o objetivo desta resposta. Salud!Isso copiará todo o conteúdo, menos os arquivos .dot. Eu uso isso para exportar projetos clonados git para o repositório git do meu aplicativo Web sem o material .git.
Plain old bash funciona muito bem :)
fonte
.gitignore
, isso não acontece.Tão simples quanto o clone, exclua a pasta .git:
git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git
fonte
Para usuários do GitHub, o
git archive --remote
método não funcionará diretamente, pois o URL de exportação é efêmero . Você deve solicitar o URL ao GitHub e fazer o download desse URL.curl
facilita isso:Isso fornecerá o código exportado em um diretório local. Exemplo:
Editar
Se você deseja que o código seja colocado em um diretório existente específico (e não no diretório aleatório do github):
fonte
Sim, este é um comando limpo e arrumado para arquivar seu código sem nenhuma inclusão do git no arquivo morto e é bom distribuir sem se preocupar com o histórico de confirmação do git.
fonte
Eu só quero salientar que no caso de você estar
Então você pode apenas usar em
cp foo [destination]
vez do mencionadogit-archive master foo | -x -C [destination]
.fonte
Você pode arquivar um repositório remoto em qualquer confirmação como arquivo zip.
fonte
Implementação bash do git-export.
Eu segmente os processos de criação e remoção de arquivos .empty por sua própria função, com o objetivo de reutilizá-los na implementação do 'git-archive' (será publicado posteriormente).
Também adicionei o arquivo '.gitattributes' ao processo para remover arquivos indesejados da pasta de exportação de destino. Inclusão de verbosidade no processo, além de tornar a função 'git-export' mais eficiente.
EMPTY_FILE = ". Vazio";
fonte
Se você quiser algo que funcione com submódulos, isso pode valer a pena.
Nota:
Premissas:
fonte
Minha preferência seria realmente ter um destino dist no seu Makefile (ou outro sistema de compilação) que exporte um arquivo distribuível do seu código (.tar.bz2, .zip, .jar ou o que for apropriado). Se você estiver usando ferramentas automáticas GNU ou sistemas MakeMaker da Perl, acho que isso existe automaticamente para você. Caso contrário, eu recomendo adicioná-lo.
ETA (06/09/2012): Uau, votos duros. Ainda acredito que é melhor criar suas distribuições com suas ferramentas de compilação do que com a ferramenta de controle de código-fonte. Acredito na construção de artefatos com ferramentas de construção. No meu trabalho atual, nosso principal produto é construído com um alvo de formigas. Estamos no meio da troca de sistemas de controle de código fonte, e a presença desse alvo formiga significa menos problemas na migração.
fonte
Isso copiará os arquivos em um intervalo de confirmações (C a G) para um arquivo tar. Nota: isso só obterá os arquivos confirmados. Não é o repositório inteiro. Ligeiramente modificado daqui
Exemplo de histórico de confirmação
A -> B -> C -> D -> E -> F -> G -> H -> I
Página de manual do git-diff-tree
-r -> recursão em subárvores
--no-commit-id -> git diff-tree gera uma linha com o ID de confirmação, quando aplicável. Este sinalizador suprimiu a saída do ID de confirmação.
--name-only -> Mostra apenas os nomes dos arquivos alterados.
--diff-filter = ACMRT -> Selecione apenas esses arquivos. Veja aqui a lista completa de arquivos
C..G -> arquivos neste intervalo de confirmações
C ~ -> Incluir arquivos do Commit C. Não apenas arquivos desde o Commit C.
| xargs tar -rf myTarFile -> saídas para tar
fonte
Pelo que entendi, é mais sobre baixar apenas um determinado estado do servidor, sem histórico e sem dados de outras ramificações, em vez de extrair um estado de um repositório local (como muitas respostas aqui fazem).
Isso pode ser feito assim:
--single-branch
está disponível desde Git 1.7.10 (abril de 2012).--depth
é (foi?) supostamente defeituoso, mas, no caso de uma exportação, os problemas mencionados não devem importar.fonte
--depth
, que implica a--single-branch
menos que--no-single-branch
seja fornecida, o que significa que provavelmente tem o mesmo efeito. Não tenho certeza, porém, algum especialista pode confirmar?Eu precisava disso para um script de implantação e não podia usar nenhuma das abordagens mencionadas acima. Em vez disso, descobri uma solução diferente:
fonte
mkdir -p "$2" && git --git-dir="$1" archive HEAD | tar -x -C "$2"
mas um pouco mais demorado.Fazendo da maneira mais fácil, esta é uma função para .bash_profile, descompacta diretamente o arquivo na localização atual, configure primeiro o seu habitual [url: path]. NOTA: Com essa função, você evita a operação de clone, ela é obtida diretamente do repositório remoto.
Alias para .gitconfig, a mesma configuração necessária (TAKE CARE executando o comando dentro dos projetos .git, ele SEMPRE salta para o diretório base anteriormente como dito aqui , até que isso seja corrigido. Pessoalmente, prefiro a função
fonte
De longe, a maneira mais fácil de fazer (e também funciona no Windows) é
git bundle
:git bundle create /some/bundle/path.bundle --all
Veja esta resposta para obter mais detalhes: Como copiar meu repositório git da minha máquina Windows para uma máquina Linux via drive USB?
fonte
git bundle
inclui a.git
pasta, que é o que o OP não deseja;git archive
Parece que a forma mais adequada--all
switch?Eu tenho outra solução que funciona bem se você tiver uma cópia local do repositório na máquina em que deseja criar a exportação. Nesse caso, vá para este diretório do repositório e digite este comando:
GIT_WORK_TREE=outputdirectory git checkout -f
Isso é particularmente útil se você gerencia um site com um repositório git e gostaria de fazer check-out de uma versão limpa
/var/www/
. Nesse caso, adicione este comando em um.git/hooks/post-receive
script (hooks/post-receive
em um repositório vazio, o que é mais adequado nessa situação)fonte
Eu acho que a postagem de @Aredridel foi a mais próxima, mas há um pouco mais disso - então eu adicionarei isso aqui; o problema é,
svn
se você estiver em uma subpasta de um repositório, e você faz:em seguida
svn
, exportará todos os arquivos que estão sob controle de revisão (eles também podem ter o status Adicionado recentemente ou Modificado) - e se você tiver outro "lixo" nesse diretório (e não estou contando.svn
subpastas aqui, mas coisas visíveis, como.o
arquivos) , não será exportado; somente os arquivos registrados pelo repositório SVN serão exportados. Para mim, uma coisa boa é que essa exportação também inclui arquivos com alterações locais que ainda não foram confirmadas; e outra coisa interessante é que os carimbos de data e hora dos arquivos exportados são os mesmos que os originais. Ou, comosvn help export
coloca:Para perceber que
git
não preservará os carimbos de data e hora, compare a saída desses comandos (em uma subpasta de umgit
repositório de sua escolha):... e:
... e eu, em qualquer caso, noto que
git archive
faz com que todos os carimbos de data e hora do arquivo arquivado sejam os mesmos!git help archive
diz:... mas aparentemente ambos os casos definem o "tempo de modificação de cada arquivo"; dessa forma, não preservando os registros de data e hora reais desses arquivos!
Portanto, para preservar também os registros de data e hora, aqui está um
bash
script, que é realmente "uma linha", embora um pouco complicado - então, abaixo, ele é postado em várias linhas:Observe que se supõe que você esteja exportando o conteúdo no diretório "atual" (acima
/media/disk/git_svn/subdir
) - e o destino para o qual você está exportando é um pouco inconveniente, mas está naDEST
variável de ambiente. Observe que com este script; você deve criar oDEST
diretório manualmente, antes de executar o script acima.Após a execução do script, você poderá comparar:
... e espero ver os mesmos registros de data e hora (para os arquivos que estavam sob controle de versão).
Espero que isso ajude alguém,
Saúde!
fonte
uma exportação git para um arquivo zip ao adicionar um prefixo (por exemplo, nome do diretório):
fonte
Se você também precisar de submódulos, faça o seguinte: https://github.com/meitar/git-archive-all.sh/wiki
fonte
Eu tenho a seguinte função de utilitário no meu arquivo .bashrc: ele cria um arquivo da ramificação atual em um repositório git.
fonte