Clone do Git sem diretório .git

144

Existe um sinalizador para passar ao gitfazer um clone, por exemplo, não clone o .gitdiretório? Caso contrário, que tal um sinalizador para excluir o .gitdiretório após o clone?

Justin
fonte
41
Esta questão não é uma brincadeira de Como fazer uma "exportação git" (como "exportação svn") . Esta pergunta pergunta sobre como clonar um repositório (remoto) sem o .gitdiretório. O suposto idiota pergunta como exportar um repositório existente para o qual você já possui o .gitdiretório.
Mknaf #
3
Aceita. Você não pode git archiverepositório remoto como diz a solução "possível duplicada".
Vladislav Rastrusny

Respostas:

214

Usar

git clone --depth=1 --branch=master git://someserver/somerepo dirformynewrepo
rm -rf ./dirformynewrepo/.git
  • A opção de profundidade garantirá que você copie o mínimo de histórico possível para obter esse repositório.
  • A opção de ramificação é opcional e, se não for especificada, seria master.
  • A segunda linha fará com que seu diretório dirformynewreponão seja mais um repositório Git.
  • Se você estiver executando um clone recursivo do submódulo, o parâmetro de profundidade e ramificação não se aplicará aos submódulos.
Adam Dymitruk
fonte
19
o que !$/.gitsignifica
Jürgen Paul
15
Para os interessados, é um dos designadores de palavras , parte do recurso de expansão do histórico no Bash e no zsh.
Rufflewind
Existe uma maneira de obter a profundidade = 1 de todos os ramos no repositório? não apenas mestre ou ramo especificado
Gayan Pathirage
2
você faz isso com a opção --no-single-branch, uma vez que --thpth implica --single-branch, você pode desimplicá-lo com --no-single-branch. (Retirado da página homem clone git)
Robert Stoddard
8
O uso !$, embora tecnicamente correto neste caso, não ajuda em nada as pessoas que não reconhecem a sintaxe a entender a resposta para a pergunta real. Ele também conta com o segundo comando diretamente após o primeiro e dentro do mesmo shell. Se alguém omite esses requisitos implícitos, pode acabar excluindo outra coisa completamente. Portanto, sugiro que sua resposta possa ser melhorada especificando explicitamente o nome dirformynewrepocomo um argumento para o rmcomando, pois isso tornará a conexão entre os dois comandos muito mais clara.
DavidA
29

como você deseja apenas os arquivos, não precisa tratá-lo como um repositório git.

rsync -rlp --exclude '.git' user@host:path/to/git/repo/ .

e isso funciona apenas com o caminho local e o caminho ssh / rsync remoto, pode não funcionar se o servidor remoto fornecer apenas acesso git: // ou https: //.

Huang Tao
fonte
que não levará em consideração o .gitignore?
JJ Roman
itub está certo, isso é apenas copiar a árvore de trabalho. O git checkout costumava fazer isso corretamente, agora não é mais.
Sylvain
então, o que você faz se o servidor fornece apenas acesso git: //?
Rainb 26/06
4

Como alternativa, se você tiver o Node.js instalado, poderá usar o seguinte comando:

npx degit GIT_REPO

npxé fornecido com o Node e permite executar pacotes binários baseados em nós sem instalá-los primeiro (como alternativa, você pode instalar degitglobalmente usando npm i -g degit).

Degit é uma ferramenta criada por Rich Harris, criador do Svelte e Rollup, que ele usa para criar rapidamente um novo projeto ao clonar um repositório sem manter a pasta git. Mas também pode ser usado para clonar qualquer repo uma vez ...

Erik Vullings
fonte
-1

Você sempre pode fazer

git clone git://repo.org/fossproject.git && rm -rf fossproject/.git

fonte
44
baixar tudo e excluir o dir mais tarde? por exemplo, o emacs possui 95% de 1 GB no .git. então - profundidade = 1 é a solução aqui claramente.
RParadox
1
eu ainda vejo a pasta .git quando eu faço profundidade = 1
Aryeh Armon
@AryehArmon, é claro que você vê. Usar - profundidade não impede a criação de .git, apenas torna uma cópia superficial, tamanho muito menor para .git. Mas se você não deseja que esteja lá, precisará removê-lo posteriormente.
zeycus