Como fazer o Git clonar no diretório atual

499

Estou fazendo:

git clone ssh://[email protected]/home/user/private/repos/project_hub.git ./

Estou entendendo:

Fatal: caminho de destino '.' já existe e não é um diretório vazio.

Eu sei o caminho. já existe. E posso garantir que o diretório esteja vazio. (Eu estou dentro e não vejo nada!)

O que estou perdendo aqui para clonar esse projeto no diretório atual?

MEM
fonte
16
se você ls -avê um .gitdiretório?
Davin Tryon
2
@ Dtryon - Não. Mas eu vejo um DS_Store seja o que for. Talvez eu devesse me livrar disso. Obrigado por isso -a: s
MEM
@Obrigado pela sua resposta rápida. James Maclaughlin, que parece um comando bonito para garantir que clonamos em um diretório vazio. :)
MEM
1
Suponho que você esteja em um Mac . Isso ajuda: stackoverflow.com/questions/107701/…
Davin Tryon
Pelo que vale a pena, qualquer pasta que você navegue em um Mac terá esses pequenos arquivos criados lá. É muito chato para os usuários do Windows que estão usando os mesmos compartilhamentos e para qualquer sistema (por exemplo, git) que precisa que as pastas estejam vazias ou executa ações programaticamente em todos os arquivos de uma pasta.
Jsims281

Respostas:

510

basta colocar um ponto ao lado dele

git clone [email protected]:user/my-project.git .

De git help clone:

A clonagem em um diretório existente é permitida apenas se o diretório estiver vazio.

Portanto, verifique se o diretório está vazio (verifique com ls -a), caso contrário, o comando falhará.

Roshan Pal
fonte
18
concordado, observe que em um mac, um arquivo .DS_Store criado automaticamente pelo localizador bloqueará o clone. Verifique comls -la
ptim
281
Não. Esta não é a resposta certa. Isso ainda retornaria "fatal: caminho de destino '.' já existe e não é um diretório vazio ".
Sid Sarasvati
16
Funciona para mim usando o git v1.8.3.2. @SidSarasvati Tem certeza de que o diretório atual está vazio ?
Wesley Baugh 02/02
3
@SidSarasvati bem para mim, o diretório não está vazio, mas eu não me importo com isso, então não sei por que o Git o faria. Por que o git não pode ser clonado em um diretório não vazio? Certamente funcional é apenas um download básico.
Nathan Hornby
3
mkdircria hardlinks para .e ..por padrão, então um novo diretório é tecnicamente "vazio" em sistemas baseados em Unix? Quer dizer, eu acho que você poderia unlink .e unlink .., mas que pode causar enormes problemas mais tarde se você esquecer de re-ligação novamente após clonagem ....
SeldomNeedy
351

O seguinte provavelmente não é totalmente equivalente a um clone em todos os casos, mas fez o truque para mim:

git init .
git remote add -t \* -f origin <repository-url>
git checkout master

No meu caso, isso produz um .git/configarquivo equivalente ao que recebo ao fazer um clone.

Andre Holzner
fonte
40
Além disso, esse é o encantamento que permite que o conteúdo atual permaneça - por exemplo, se você estiver clonando seus arquivos de ponto no diretório inicial.
rbellamy
7
Com isso, finalmente posso clonar em qualquer pasta que eu quiser, sem que o Git me trate como um bebê. Quando também adicionei um .gitignore temporário contendo *(ignorar tudo), eu poderia executar, git checkout mastermesmo que já houvesse outros arquivos na pasta. Todos os arquivos confirmados do repositório foram clonados (e o .gitignore temporário foi sobrescrito pelo .gitignore apropriado do repositório). Tudo funcionou maravilhosamente. Deve acontecer dessa maneira por si só usando git clone -fou algo assim.
23414 PaulMag
1
se você tem arquivos que são diferentes / novo / alterado que será escrito sobre (... arquivos seria substituído por check-out ... Abortar) uso: mestre git checkout -f
visualex
3
O -t \*é desnecessário, pois é o padrão.
Palec
1
git remote set-head origin -apode ser útil. Ele define o branch padrão da origem ( refs/remotes/origin/HEAD) conforme definido no repositório remoto. git clonefaz isso automaticamente, ao contrário git remote add -f.
Palec
212

@ Andrew respondeu claramente aqui . Mas tão simples quanto isso também funciona, mesmo que o diretório não esteja vazio:

git init .
git remote add origin <repository-url>
git pull origin master
ambes
fonte
Estou feliz em confirmar <repository-url>que também pode ser um repo local comogit remote add origin /path/to/existing/repo
krubo 4/19
60

Para ter certeza de que você pode clonar o repositório, vá para qualquer diretório temporário e clone o projeto lá:

git clone ssh://[email protected]/home/user/private/repos/project_hub.git

Isso clonará suas coisas em um project_hubdiretório.

Depois que a clonagem terminar, você poderá mover este diretório para onde quiser:

mv project_hub /path/to/new/location

Isso é seguro e não requer nenhum material mágico por perto.

eckes
fonte
9
Isso criará um subdiretório no /path/to/new/locationdiretório preexistente que certamente não é o ponto da questão.
Pavel Šimerda
Então você terá que mover manualmente os arquivos ocultos ou usar um comando complicado ... e ele não responde à pergunta.
Preto
54
git clone your-repo tmp && mv tmp/.git . && rm -rf tmp && git reset --hard
return1.at
fonte
este é um ajuste: D
Sarnath Jegadeesan
15

Hmm ... especificar o caminho da corrente absoluta usando $(pwd)funcionou para mim.

git clone https://github.com/me/myproject.git $(pwd)

versão git: 2.21.0

Nick Grealy
fonte
13

Se o diretório atual estiver vazio, isso funcionará:

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo
GoZoner
fonte
1
no meu caso, funcionou mesmo com alguns arquivos no '.' diretório
OSdave
2
Observe que qualquer arquivo de ponto nos diretórios em foo, por exemplo. foo / bar / .foobar não será movido com este comando. Veja a resposta de @phatblat
lea
10

Além da resposta de @ StephaneDelcroix, antes de usar:

git clone [email protected]/my-project.git .

verifique se o diretório atual está vazio usando

ls -a
Jakehao
fonte
Diante deste problema hoje. Aconteceu que eu ocultava as pastas .git e .gitignore no diretório para o qual estava tentando clonar o repositório. Quando removi essas pastas, tudo estava bem.
Tamara
O que seria o comando para esvaziar o diretório atual? Eu acho que seria mais útil do que apenas verificando-lo :)
pie6k
9

Solução: Nesse caso, a solução estava usando o dot, então:rm -rf .* && git clone ssh://[email protected]/home/user/private/repos/project_hub.git .

rm -rf .* && pode ser omitido se tivermos certeza absoluta de que o diretório está vazio.

Os créditos vão para: @James McLaughlin nos comentários abaixo.

MEM
fonte
10
Parece ruim, já que. * Inclui o diretório pai! me: ~ / tmp / tmp / tmp $ ls -d .* . .. me: ~ / tmp / tmp / tmp $
stackunderflow
Isso não ajuda, porque tenho dependências no diretório em que preciso fazer o checkout.
b01
18
Não sei se é aconselhável escrever rm -rf (de qualquer forma) em uma resposta SO sem algum sinal de aviso REALMENTE ASSUSTADOR. Algum usuário inexperiente pode vir aqui procurando a "marca de verificação verde" (geralmente a melhor resposta) e depois copiar e colar este comando e puf ... lá vai seu trabalho duro no diretório atual. BTW: rm -rf ./.*é "mais seguro" se você apenas remover os arquivos e diretórios ocultos (pontos) sob o diretório atual (exatamente como @stackunderflow declarou antes de mim). Mas rm -rfé um comando perigoso para os usuários inexperientes, portanto, tenha cuidado! Apenas meus 2 centavos.
Andrew
obras sobre 1.7.1 O interior única pasta foi .gitdepois git init(eu sabia que)
vladkras
Você não precisa -rfexcluir arquivos normais. Considere excluir esta resposta ou, pelo menos, aceitar uma resposta diferente.
Navin
6

Melhorando a resposta do @ GoZoner:

git clone <repository> foo; shopt -s dotglob nullglob; mv foo/* .; rmdir foo

O comando shopt é obtido desta resposta do SO e altera o comportamento do comando 'mv' no Bash para incluir arquivos de ponto, que você precisará incluir no diretório .git e em qualquer outro arquivo oculto.

Observe também que isso só funcionará como está se o diretório atual (.) Estiver vazio, mas funcionará desde que nenhum dos arquivos no repositório clonado tenha o mesmo nome que os arquivos no diretório atual. Se você não se importa com o que está no diretório atual, pode adicionar a opção -f (force) ao comando 'mv'.

phatblat
fonte
6

Eu tive essa mesma necessidade. No meu caso, eu tinha uma pasta da web padrão criada por uma instalação do servidor da web. Para os fins desta ilustração, digamos que seja

/server/webroot

e o webroot contém outros arquivos e pastas padrão. Meu repositório apenas possui os arquivos específicos do site (html, javascript, CFML etc.)

Tudo que eu tinha que fazer era:

cd /server/webroot

git init

git pull [url to my repo.git]

Você precisa ter o cuidado de executar o git init na pasta de destino, porque se NÃO fizer isso, uma das duas coisas acontecerá:

  1. O pull git simplesmente falhará com uma mensagem sobre nenhum arquivo git, no meu caso:

fatal: Não é um repositório git (ou qualquer um dos diretórios pai): .git

  1. Se não é um lugar arquivo .git no caminho pai para a pasta de seu repo puxado será criada naquele pai que contém o arquivo .git. Isso aconteceu comigo e fiquei surpreso com isso ;-)

Isso NÃO perturbou nenhum dos arquivos "padrão" que tenho na minha pasta raiz da web, mas precisei adicioná-los ao arquivo .gitignore para impedir a adição inadvertida deles às confirmações subsequentes.

Essa parece ser uma maneira fácil de "clonar" em um diretório não vazio. Se você não deseja que os arquivos .git e .gitignore sejam criados pelo pull, basta excluí-los após o pull.

igeocacher
fonte
5

Melhorando ainda mais a resposta do @ phatblat :

git clone --no-checkout <repository> tmp \
  && mv tmp/.git . \
  && rmdir tmp \
  && git checkout master

como um forro:

git clone --no-checkout <repository> tmp && mv tmp/.git . && rmdir tmp && git checkout master

166_MMX
fonte
2
shopt -s dotglob
git clone ssh://[email protected]/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp
John Josef
fonte
3
Forneça mais informações para explicar por que seu código corrige o problema e o que ele faz.
Martin
"git clone ... tmp" - cria a pasta / tmp no diretório em que o comando é executado e clona o repositório Git. Então "mv tmp / *." - move todos os arquivos da pasta / tmp na pasta pai (onde o comando anterior foi executado) e finalmente "rm -rf tmp" - remove a pasta / tmp.
Marinski
1

use. (ponto) no final do seu comando, como abaixo

URL do clone git .

Upendra
fonte
Isso não funciona no mac, causa erro: # fatal: destination path '.' already exists and is not an empty directory.
Pedro Pedro
Para mac :: Você deve estar no diretório pai e, em seguida, usar o nome da pasta em vez de. (Ponto) como abaixo do URL do clone git clodename Verifique se a sua pasta está vazia.
Upendra
0

Aqui estava o que eu encontrei:

Eu vejo isso:

fatal: destination path 'CouchPotatoServer' already exists and is not an empty directory.

Entre minhas pesquisas, eu tropecei em:

https://couchpota.to/forum/viewtopic.php?t=3943

Procure a entrada de Clinton. Hall ... Se você tentar isso (como eu fiz), provavelmente obterá a access deniedresposta, houve a minha primeira pista; portanto, o erro inicial (para mim) estava realmente escapando à raiz errada questão.

Solução para isso no Windows: certifique-se de executar cmdou git elevated, em seguida, execute:

git clone https://github.com/RuudBurger/CouchPotatoServer.git

O problema acima foi meu e simplesmente elevar funcionou para mim.

ynotjs
fonte
0

A solução Windowsé clonar o repositório em outra pasta e copiar e colar no local original ou apenas copiar a .gitpasta invisível.

croppio.com
fonte
-1

Removendo com

rm -rf. *

pode causar problemas ou mais alguns erros.

Se você possui / caminho / para / pasta e gostaria de remover tudo o que está dentro, mas não a pasta, basta executar:

rm -rf / caminho / para / pasta / *

Sid
fonte
-1

Portanto, corrigi esse mesmo erro excluindo a pasta .git oculta no meu diretório raiz e adicionando um ponto ao 'repositório de clones do git'. na minha pasta raiz / dist. Isso está no contexto de um projeto do webpack vue-cli. Portanto, o que todo mundo está dizendo está certo, geralmente significa que você tem o git tracking na pasta na qual você está tentando clonar ou na pasta pai ou raiz da pasta em questão!

Akin Hwan
fonte
-1
git clone ssh://[email protected]/home/user/private/repos/project_hub.git $(pwd)
Catalin
fonte
Observe que isso ainda resultará no mesmo erro publicado na pergunta (" fatal: o caminho de destino 'resolvido / caminho / do / pwd' já existe e não é um diretório vazio. ") Se você estiver fazendo isso em um espaço não vazio. diretório.
Gino Mempin
-2

é útil criar um novo arquivo e mkdir filename, em seguida, executar o comando de git clone xxxxx, ele funciona no meu computador

crazier-qi
fonte
-3

Eu já vi essa pergunta tantas vezes - e só quero ressaltar que git pullde dentro do seu diretório fará o truque.

A menos que eu esteja perdendo alguma coisa aqui - que funcionou para mim.

itamar
fonte
5
git pullnão fará nada se você não tiver um repositório definido, o que é uma parte crítica do que git clonefaz.
Hackel