Eu tenho uma cópia de trabalho do projeto, sem nenhum metadado de controle de origem. Agora, eu gostaria de fazer o equivalente ao git-clone nessa pasta e manter minhas alterações locais.
O git-clone não me permite clonar em uma pasta existente. Qual é a melhor prática aqui?
Respostas:
Isso pode ser feito clonando em um novo diretório e movendo o
.git
diretório para o diretório existente.Se o seu diretório existente tiver o nome "código".
Isso também pode ser feito sem fazer um checkout durante o comando clone; mais informações podem ser encontradas aqui .
fonte
git clone
como o primeiro comando, nenhum comando adicional de checkout será necessário. Se você usar algo comogit clone --no-checkout
o primeiro passo, depois que o diretório .git for movido, será necessário usargit reset HEAD
para informar ao git que os arquivos não foram excluídos.git status
.Não clone, busque. No repositório:
Em seguida, você pode redefinir a árvore para obter a confirmação que deseja:
e você é como se você fosse clonado.
A questão interessante aqui (e a que não tem resposta): Como descobrir em qual commit sua árvore nua foi baseada, daí para qual posição redefinir.
fonte
A seguir, fiz o checkout da filial principal em um diretório existente:
fonte
-t
bandeira é usada aqui?Gostaria
git clone
de um novo diretório e copie o conteúdo do diretório existente para o novo clone.fonte
git clone wherever tmp && git mv tmp/.git . && rm -rf tmp
Em outras palavras, mover o.git
dir de um clone temporário parece mais simples do que limpar a árvore de trabalho do clone e copiar os arquivos existentes lá.git mv tmp/.git .
voltafatal: cannot move directory over file, source=tmp/.git, destination=.git
para mim. Alguém sabe qual é o problema?mv
, nãogit mv
; embora isso não explique por que você já possui um.git
arquivo (contendogitdir: some/path/to/a/git-dir
um "gitfile"; se ele não estivesse lá, você o teria vistofatal: Not a git repository (or any of the parent directories): .git
).Usar um diretório temporário é bom, mas isso funcionará se você desejar evitar essa etapa. Na raiz do seu diretório de trabalho:
fonte
git reset --hard origin/master
irá remover todos os arquivos locais.hard
emixed
é que o misto manterá as alterações locais (por isso, se você tentar puxá-lo mais tarde, ele mostrará, por exemplo: Não é possível puxar com rebase: você tem alterações sem etapas. Confirme ou esconda-as ) , enquanto difícil descartará essas alterações locaisfonte
git reset --hard
irá alterar as alterações do arquivo local, especificamente NÃO o que este OP solicitou.--mixed
deve ser usado em seu lugar.Para clonar um repositório git em um diretório existente vazio, faça o seguinte:
Observe o
.
no final do seugit clone
comando. Isso fará o download do repositório no diretório de trabalho atual.fonte
fatal: destination path '.' already exists and is not an empty directory.
Já existem muitas respostas para fazê-lo da maneira que o OP pediu. Mas vale a pena notar que fazer o contrário é muito mais simples:
Agora você tem o estado de destino desejado - novo clone + alterações locais.
fonte
Existem duas abordagens para isso. Sempre que possível, eu começaria com uma pasta limpa para o seu novo diretório de trabalho do git e depois copiaria sua versão das coisas mais tarde. Isso pode parecer algo como *:
Nesse ponto, você deve ter uma cópia de trabalho bastante limpa com sua pasta de trabalho anterior como o diretório de trabalho atual, para que quaisquer alterações, incluindo exclusões de arquivos, apareçam no radar se você executar
git status
.Por outro lado, se você realmente deve fazer o contrário, pode obter o mesmo resultado com algo assim:
De qualquer forma, a primeira coisa que eu faria é executar algo como
git stash
obter uma cópia de todas as suas alterações locais, depois você poderá reaplicá-las e trabalhar com as quais deseja se comprometer.* Ambos os exemplos pressupõem que você comece no shell no diretório pai do seu projeto.
fonte
Este é o melhor de todos os métodos que me deparei
Clone apenas a pasta .git do repositório (excluindo os arquivos já existentes
existing-dir
) em um diretório temporário vaziogit clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
// pode querer --no-hardlinks para clonagem de repositório localMova a pasta .git para o diretório com os arquivos. Isso
existing-dir
cria um repositório Git.mv existing-dir/existing-dir.tmp/.git existing-dir/
Exclua o diretório temporário
rmdir existing-dir/existing-dir.tmp
cd existing-dir
O Git pensa que todos os arquivos foram excluídos, isso reverte o estado do repositório para HEAD.
AVISO: quaisquer alterações locais nos arquivos serão perdidas.
git reset --mixed HEAD
fonte
Se você estiver usando pelo menos o git 1.7.7 (que ensinou
clone
a--config
opção), para transformar o diretório atual em uma cópia de trabalho:Isso funciona por:
.git
pasta--mirror
transforma o novo clone em uma pasta puramente de metadados, conforme.git
necessário--config core.bare=false
controla o implícitobare=true
da--mirror
opção, permitindo que o repositório tenha um diretório de trabalho associado e atue como um clone normalObviamente, isso não funcionará se um
.git
diretório de metadados já existir no diretório que você deseja transformar em uma cópia de trabalho.fonte
[core]
seção da configuração local incluindo ambosbare = true
ebare = false
. Mais problemático é que ele terá os valores incorretos para oorigin
controle remoto, com a[remote "origin"]
seção incluindomirror = true
e uma especificação de busca que não funcionará corretamente com uma cópia de trabalho. Após corrigir esses problemas, a clonagem normal e a movimentação das novas cópias de trabalho.git
terão sido mais eficientes.Normalmente, clonarei primeiro o repositório inicial e depois moverei tudo na pasta existente para o repositório inicial. Funciona sempre.
A vantagem desse método é que você não perderá nada do repositório inicial, incluindo README ou .gitignore.
Você também pode usar o comando abaixo para concluir as etapas:
fonte
Você pode fazer isso digitando as seguintes linhas de comando recursivamente:
fonte
Basta usar o. no final do
git clone
comando (estando nesse diretório), assim:fonte