Como você clona um repositório Git em uma pasta específica?

2244

A execução do comando git clone [email protected]:whatevercria um diretório na minha pasta atual denominada whatevere coloca o conteúdo do repositório Git nessa pasta:

/httpdocs/whatever/public

Meu problema é que preciso que o conteúdo do repositório Git seja clonado no meu diretório atual para que eles apareçam no local apropriado para o servidor da Web:

/httpdocs/public

Eu sei como mover os arquivos depois de clonar o repositório, mas isso parece quebrar o Git, e eu gostaria de poder atualizar apenas ligando git pull. Como posso fazer isso?

David Smith
fonte
3
No Windows, você pode mover os arquivos da pasta em que clonará o repositório [se houver], para que fique vazio quando você fizer o git clone . Após a clonagem, mova seus arquivos de volta [ctrl-z] e whoala ! Se a pasta atual estiver vazia, use: git clone giturl .
44
voila é a ortografia
Matthias
81
@MatthiasDailey voilà é a actual ortografia
silkfire
6
et voilà é francês para et voilà
Fattie 01/02

Respostas:

3221

Opção A:

git clone [email protected]:whatever folder-name

Ergo, para right hereuso:

git clone [email protected]:whatever .

Opção B:

Mova a .gitpasta também. Observe que a .gitpasta está oculta na maioria dos exploradores gráficos de arquivos, portanto, certifique-se de mostrar os arquivos ocultos.

mv /where/it/is/right/now/* /where/I/want/it/
mv /where/it/is/right/now/.* /where/I/want/it/

A primeira linha pega todos os arquivos normais, a segunda linha pega arquivos de ponto. Também é possível fazê-lo em uma linha ativando o dotglob (ie shopt -s dotglob), mas essa provavelmente é uma solução ruim se você estiver fazendo a pergunta que esta resposta responde.

Melhor ainda:

Mantenha sua cópia de trabalho em outro lugar e crie um link simbólico. Como isso:

ln -s /where/it/is/right/now /the/path/I/want/to/use

Para o seu caso, isso seria algo como:

ln -sfn /opt/projectA/prod/public /httpdocs/public

O que poderia ser facilmente alterado para testar se você quisesse, ou seja:

ln -sfn /opt/projectA/test/public /httpdocs/public

sem mover arquivos. Adicionado -fnno caso de alguém copiar essas linhas ( -fforçar, -nevite algumas interações indesejadas com links já existentes e não existentes).

Se você quiser que ele funcione, use a Opção A; se alguém quiser ver o que você fez, use a Opção C.

Can Berk Güder
fonte
8
Eu não tinha pensado na sua opção "Melhor ainda" e gosto, embora não tenha certeza do porquê. Quais são as vantagens disso?
21415 David Smith
6
Provavelmente não oferece nenhuma vantagem no momento, mas pode poupar muitos problemas se você decidir mudar as coisas um dia.
Can Berk Guder
12
Além disso, você pode alternar entre os lançamentos rapidamente com a opção "Melhor ainda". Isso é especialmente útil e usado para servidores.
Halil Özgür
4
@MEM Eu acho que ele significa criar um link simbólico para .git ieln -s path/to/.git path/to/working/directory
Alexander
27
Alguém pode explicar os benefícios disso? Estou sendo um pouco denso hoje. Como o uso de um link simbólico beneficia os servidores?
triple
586

O exemplo que acho que muitas pessoas estão fazendo é o seguinte. Se você estiver no diretório em que deseja despejar o conteúdo do repositório git, execute:

git clone [email protected]:whatever .

O "." no final especifica a pasta atual como a pasta de checkout.

J Wynia
fonte
28
true, então você não deseja executar o "git init" nesta pasta antes de cloná-la. Mas se você fez isso, remover a pasta .git antes da clonagem fará o truque.
Magne
3
corrigido para diretórios vazios na minha resposta
csomakk
1
Não foi possível fazer isso funcionar no nitous.io? mesmo depois de esvaziar, diz diretório não está vazio
Tejas Manohar
@TejasManohar Certifique-se de que você também excluiu arquivos ocultos.
Britic
ls -airá mostrar todos os arquivos, incluindo os ocultos.
Michael Dorst
215

Vá para a pasta. Se a pasta estiver vazia, então:

git clone [email protected]:whatever .

outro

git init
git remote add origin PATH/TO/REPO
git fetch
git checkout -t origin/master
csomakk
fonte
9
Na verdade, essa foi a resposta mais útil para mim quando eu apenas precisei enviar o projeto já criado para o repositório recém-criado. Parabéns!
Wirher 28/11/14
13
Resposta apenas que especifica como fazer checkout em uma pasta não vazia, obrigado.
Preston Badeer 21/03
2
Isso é realmente útil, pois o switch -ton não é mostrado claramente na documentação do git checkout .
Chetabahana
4
o que a opção -t faz? Estou recebendo uma mensagem de cancelamento com uma lista de arquivos não rastreados que serão substituídos pelo checkout? O que fazer nessa situação? Não quero que esses arquivos sejam substituídos?
Momin Zahid
2
-t documentação do git: -t, --track Ao criar uma nova ramificação, configure a configuração "upstream". Veja "--track" no git-branch (1) para detalhes.
precisa saber é o seguinte
87

Clonagem básica de repositório Git

Você clona um repositório com

git clone [url]

Por exemplo, se você deseja clonar a biblioteca Git do Framework Aberto Drupal da Universidade de Stanford chamada open_framework, é possível fazer o seguinte:

$ git clone git://github.com/SU-SWS/open_framework.git

Isso cria um diretório chamado open_framework (no local atual do sistema de arquivos), inicializa um diretório .git dentro dele, extrai todos os dados desse repositório e faz check-out de uma cópia de trabalho da versão mais recente. Se você for para o diretório open_framework recém-criado, verá os arquivos do projeto, prontos para serem trabalhados ou usados.

Clonando um Repositório em uma Pasta Local Específica

Se você deseja clonar o repositório em um diretório chamado algo diferente de open_framework, é possível especificar isso como a próxima opção da linha de comandos:

$ git clone git:github.com/SU-SWS/open_framework.git mynewtheme

Esse comando faz a mesma coisa que o anterior, mas o diretório de destino é chamado mynewtheme.

O Git possui vários protocolos de transferência diferentes que você pode usar. O exemplo anterior usa o protocolo git: //, mas você também pode ver http (s): // ou user @ server: /path.git, que usa o protocolo de transferência SSH.

Craig Gjerdingen
fonte
isso criará automaticamente uma pasta na sua pasta atual e colocará os arquivos lá. Portanto, você não precisa se preocupar em substituir nenhuma outra pasta.
Arn-arn 27/03
24

Para clonar o repositório git em uma pasta específica, você pode usar o -C <path>parâmetro, por exemplo

git -C /httpdocs clone [email protected]:whatever

Embora ainda crie uma whateverpasta em cima dela, para clonar o conteúdo do repositório no diretório atual, use a seguinte sintaxe:

cd /httpdocs
git clone [email protected]:whatever .

Observe que a clonagem em um diretório existente é permitida apenas quando o diretório está vazio .

Como você está clonando em uma pasta acessível ao público, considere separar seu repositório Git da sua árvore de trabalho usando --separate-git-dir=<git dir>ou excluindo a .gitpasta na configuração do servidor da web (por exemplo, no .htaccessarquivo).

kenorb
fonte
17

Para clonar no Present Working Directory :

git clone https://github.com/link.git

Para clonar para outro diretório :

git clone https://github.com/link.git ./Folder1/Folder2

Espero que ajude :)

Sarat Chandra
fonte
Isso funcionou para mim também. não ./no início do caminho para a pasta
Alon Gouldman
13

Quando você move os arquivos para onde deseja, também está movendo o .gitdiretório? Dependendo do sistema operacional e da configuração, esse diretório pode estar oculto.

Ele contém o repositório e os arquivos de suporte, enquanto os arquivos de projeto que estão no seu /publicdiretório são apenas as versões no commit de check-out atualmente (ramificação mestre por padrão).

Paulo
fonte
13

Clone:

git clone [email protected]:jittre/name.git

Clone o "ramo específico":

git clone -b [branch-name] [email protected]:jittre/name.git
Selvamani
fonte
13

Se você deseja clonar na pasta atual, tente o seguinte:

git clone https://github.com/example/example.git ./
Luis
fonte
8
fatal: caminho de destino '.' já existe e não é um diretório vazio.
Cleiton
11

Uso

git clone <repository>

Clone o repositório localizado no <repositório> na máquina local. O repositório original pode estar localizado no sistema de arquivos local ou em uma máquina remota acessível via HTTP ou SSH.

git clone <repo> <directory>

Clone o repositório localizado em <repository> na pasta chamada <directory> na máquina local.

Fonte: Configurando um Repositório

Nagarjun
fonte
9

Certifique-se de remover o repositório .git se você estiver tentando fazer check-out no diretório atual.

rm -rf .git então git clone https://github.com/symfony/symfony-sandbox.git

alex
fonte
3

Aqui está como eu faria isso, mas criei um alias para fazer isso por mim.

$ cd ~Downloads/git; git clone https:git.foo/poo.git

Provavelmente existe uma maneira mais elegante de fazer isso, no entanto, achei que isso era mais fácil para mim.

Aqui está o alias que eu criei para acelerar as coisas. Eu fiz para o zsh, mas deve funcionar muito bem para o bash ou qualquer outra concha, como fish, xyzsh, fizsh e assim por diante.

Edite ~/.zshrc, /.bashrcetc. com o seu editor favorito (o meu é o Leafpad, então eu escreveria $ leafpad ~/.zshrc).

Minha preferência pessoal, no entanto, é criar um plugin zsh para acompanhar todos os meus aliases. Você pode criar um plugin pessoal para oh-my-zsh executando estes comandos:

$ cd ~/.oh-my-zsh/
$ cd plugins/
$ mkdir your-aliases-folder-name; cd your-aliases-folder-name
     # In my case '~/.oh-my-zsh/plugins/ev-aliases/ev-aliases'
$ leafpad your-zsh-aliases.plugin.zsh
     # Again, in my case 'ev-aliases.plugin.zsh'

Depois, adicione essas linhas ao seu arquivo alises.plugin em branco recém-criado:

# Git aliases
alias gc="cd ~/Downloads/git; git clone "

(A partir daqui, substitua seu nome pelo meu.)

Então, para que os aliases funcionem, eles (junto com o zsh) precisam ser originados (ou como quer que seja chamado). Para fazer isso, dentro do seu documento de plug-in personalizado, adicione isto:

## Ev's Aliases

#### Remember to re-source zsh after making any changes with these commands:

#### These commands should also work, assuming ev-aliases have already been sourced before:

allsource="source $ZSH/oh-my-zsh.sh ; source /home/ev/.oh-my-zsh/plugins/ev-aliases/ev-aliases.plugin.zsh; clear"
sourceall="source $ZSH/oh-my-zsh.sh ; source /home/ev/.oh-my-zsh/plugins/ev-aliases/ev-aliases.plugin.zsh"
#### 

####################################

# git aliases

alias gc="cd ~/Downloads/git; git clone "
# alias gc="git clone "
# alias gc="cd /your/git/folder/or/whatever; git clone "

####################################

Salve seu plugin oh-my-zsh e execute allsource. Se isso não funcionar, basta executar source $ZSH/oh-my-zsh.sh; source /home/ev/.oh-my-zsh/plugins/ev-aliases/ev-aliases.plugin.zsh. Isso carregará a fonte do plug-in, que permitirá que você use a allsourcepartir de agora.


Estou no processo de criar um repositório Git com todos os meus aliases. Fique à vontade para vê-los aqui: arquivos de pontos de Ev . Por favor, sinta-se à vontade para bifurcar e aperfeiçoá-los para atender às suas necessidades.

Ev-
fonte
2

Se você estiver usando sshpara git cloningque você pode usar o comando a seguir.

git -C path clone [email protected]:path_to_repo.git

por exemplo: git -C /home/ubuntu/ clone [email protected]:kennethreitz/requests.gitpuxaria o repositório git para o requestsseu /home/ubuntu/caminho.

Ankit Singh
fonte
2

Por alguma razão, essa sintaxe não se destaca:

git clone repo-url [folder]

Aqui, a pasta é um caminho opcional para a pasta local (que será um repositório local).

O Git clonetambém pullcodifica do repositório remoto para o repositório local. De fato, é verdade:

git clone repo-url  =  git init + git remote add origin repo-url + git pull
prosti
fonte
0

Embora todas as respostas acima sejam boas, eu gostaria de propor um novo método em vez de usar o método de link simbólico no diretório público do html como BEST proposto na resposta aceita. Você precisa ter acesso às configurações de host virtual do servidor.

Trata-se de configurar o host virtual do seu servidor da web apontando diretamente para o diretório do repositório. No Apache, você pode fazê-lo como:

DocumentRoot / var / www / html / website / your-git-repo

Aqui está um exemplo de um arquivo host virtual:

<VirtualHost *:443>
    ServerName example.com

    DocumentRoot /path/to/your-git-repo
    ...
    ...
    ...
    ...
</VirtualHost>
Tarik
fonte
0

Você pode usar o seguinte comando git para clonar com o nome do diretório customizado

git clone <git_repo_url> <your_custom_directory_name>

Nota: Você não precisa criar seu diretório custome, porque ele criará automaticamente

Manoj Rana
fonte
-1
For Windows user 

1> Open command prompt.
2> Change the directory to destination folder (Where you want to store your project in local machine.)
3> Now go to project setting online(From where you want to clone)
4> Click on clone, and copy the clone command.
5> Now enter the same on cmd .

It will start cloning saving on the selected folder you given .
Tarit Ray
fonte
-5

Em relação a esta linha do post original:

"Eu sei como mover os arquivos depois de clonar o repositório, mas isso parece quebrar o git"

Eu sou capaz de fazer isso e não vejo nenhum problema até agora com minhas operações de adição, confirmação, envio e recebimento.

Essa abordagem é mencionada acima, mas não é dividida em etapas. Aqui estão as etapas que funcionam para mim:

  1. clonar o repositório em qualquer pasta temporária nova
  2. CD nessa pasta raiz que você acabou de clonar localmente
  3. copie todo o conteúdo da pasta, incluindo o diretório /.git - em qualquer pasta existente que você desejar; (diga um projeto eclipse que você deseja mesclar com seu repo)

A pasta existente em que você acabou de copiar os arquivos agora está pronta para interagir com o git.

Gene Bo
fonte