Cómo hacer que Git clone en el directorio actual

500

Estoy haciendo:

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

Me estoy poniendo:

Fatal: ruta de destino '.' ya existe y no es un directorio vacío.

Conozco el camino ya existe. Y puedo asegurar que el directorio ESTÁ vacío. (¡Lo hago dentro y no veo nada!)

¿Qué me estoy perdiendo aquí para clonar ese proyecto en el directorio actual?

MEM
fuente
16
si haces un ls -a¿ves un .gitdirectorio?
Davin Tryon
2
@dtryon - No. Pero veo un DS_Store sea lo que sea. Quizás debería deshacerme de eso. Gracias por eso -a: s
MEM
@ Gracias a cuatro su respuesta rápida. James Maclaughlin que parece un comando hermoso para asegurarse de que clonemos en un directorio vacío. :)
MEM
1
Supongo que estás en una Mac . ¿Ayuda esto? Stackoverflow.com/questions/107701/…
Davin Tryon
Para lo que vale, cualquier carpeta que navegue en una Mac tendrá estos pequeños archivos creados allí. Es muy molesto tanto para los usuarios de Windows que usan los mismos recursos compartidos como para cualquier sistema (por ejemplo, git) que necesite que las carpetas estén vacías o realice acciones mediante programación en cada archivo de una carpeta.
jsims281

Respuestas:

510

simplemente pon un punto al lado

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

De git help clone:

La clonación en un directorio existente solo se permite si el directorio está vacío.

Así que asegúrese de que el directorio esté vacío (verifique con ls -a), de lo contrario el comando fallará.

Roshan Pal
fuente
18
De acuerdo, tenga en cuenta que en una Mac, un archivo .DS_Store creado automáticamente por Finder bloqueará el clon. consulte conls -la
ptim 01 de
281
No Esta no es la respuesta correcta. Esto todavía devolvería "fatal: ruta de destino". ya existe y no es un directorio vacío ".
Sid Sarasvati
16
Funciona para mí usando git v1.8.3.2. @SidSarasvati ¿Está seguro de que el directorio actual está vacío ?
Wesley Baugh
3
@SidSarasvati bueno para mí, el directorio no está vacío, pero no me importa eso, así que no estoy seguro de por qué Git lo haría. ¿Por qué no puede git clone en un directorio no vacío? Seguramente funcionalmente es solo una descarga básica.
Nathan Hornby
3
mkdircrea enlaces duros .y, ..de manera predeterminada, ¿hay un nuevo directorio técnicamente "vacío" en los sistemas basados ​​en Unix? Es decir, yo supongo que se podría unlink .y unlink ..pero que podría causar grandes problemas en el futuro si se olvida de volver a vincular de nuevo después de la clonación ....
SeldomNeedy
351

Lo siguiente probablemente no sea totalmente equivalente a un clon en todos los casos, pero me sirvió:

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

En mi caso, esto produce un .git/configarchivo que es equivalente al que obtengo al hacer un clon.

Andre Holzner
fuente
40
Además, este es el encantamiento que permite que el contenido actual permanezca, por ejemplo, si clona sus archivos de puntos en su directorio de inicio.
rbellamy
77
Con esto, finalmente puedo clonar en la carpeta que quiera sin que Git me trate como un bebé. Cuando también agregué un .gitignore temporal que contenía *(ignorar todo) podía realizarlo git checkout masteraunque ya había otros archivos en la carpeta. Luego, todos los archivos confirmados del repositorio se clonaron (y el .gitignore temporal fue sobrescrito por el .gitignore apropiado del repositorio). Todo funcionó maravillosamente. Debería suceder de esta manera por sí mismo usando git clone -fo algo.
PaulMag
1
si tiene archivos diferentes / nuevos / modificados que se sobrescribirán (... los archivos se sobrescribirán al finalizar la compra ... Anulando) use: git checkout master -f
visualex
3
El -t \*es innecesario ya que es el predeterminado.
Palec
1
git remote set-head origin -aPodría ser útil. Establece la rama predeterminada del origen ( refs/remotes/origin/HEAD) tal como se establece en el repositorio remoto. git clonehace esto automáticamente, a diferencia git remote add -f.
Palec
212

@ Andrew lo ha respondido claramente aquí . Pero tan simple como esto también funciona incluso si el directorio no está vacío:

git init .
git remote add origin <repository-url>
git pull origin master
ambes
fuente
Estoy feliz de confirmar <repository-url>que también puede ser un repositorio local comogit remote add origin /path/to/existing/repo
krubo
60

Para asegurarse de que puede clonar el repositorio, vaya a cualquier directorio temporal y clone el proyecto allí:

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

Esto clonará tus cosas en un project_hubdirectorio.

Una vez que la clonación haya finalizado, puede mover este directorio a donde quiera:

mv project_hub /path/to/new/location

Esto es seguro y no requiere ninguna cosa mágica.

Eckes
fuente
99
Esto creará un subdirectorio en el /path/to/new/locationdirectorio preexistente que ciertamente no es el punto de la pregunta.
Pavel Šimerda
Luego tendrá que mover manualmente los archivos ocultos o usar un comando complicado ... y no responde la pregunta.
Negro
54
git clone your-repo tmp && mv tmp/.git . && rm -rf tmp && git reset --hard
return1.at
fuente
esto es un ajuste: D
Sarnath Jegadeesan
15

Hmm ... especificando la ruta actual absoluta usando $(pwd)funcionó para mí.

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

versión de git: 2.21.0

Nick Grealy
fuente
13

Si el directorio actual está vacío, esto funcionará:

git clone <repository> foo; mv foo/* foo/.git* .; rmdir foo
GoZoner
fuente
1
en mi caso, funcionó incluso con algunos archivos en el '.' directorio
OSdave
2
Tenga en cuenta que cualquier archivo de puntos en directorios bajo foo, por ejemplo. foo / bar / .foobar no se moverá con este comando. Ver la respuesta de @phatblat
lea
10

Además de la respuesta de @ StephaneDelcroix, antes de usar:

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

asegúrese de que su directorio actual esté vacío usando

ls -a
Jakehao
fuente
Frente a este problema hoy. Resultó que había escondido carpetas .git y .gitignore en el directorio en el que estaba tratando de clonar el repositorio. Cuando eliminé estas carpetas, todo estaba bien.
Tamara
¿Cuál sería el comando para vaciar el directorio actual? Creo que sería más útil que simplemente comprobarlo :)
pie6k
9

Solución: en este caso, la solución estaba usando el dot, entonces:rm -rf .* && git clone ssh://[email protected]/home/user/private/repos/project_hub.git .

rm -rf .* && puede omitirse si estamos absolutamente seguros de que el directorio está vacío.

Los créditos van a: @James McLaughlin en los comentarios a continuación.

MEM
fuente
10
Esto se ve mal, ya que. * Incluye el directorio padre! me: ~ / tmp / tmp / tmp $ ls -d .* . .. me: ~ / tmp / tmp / tmp $
stackunderflow
Esto no ayuda, porque tengo dependencias en el directorio donde necesito pagar.
b01
18
No estoy seguro de que sea aconsejable escribir rm -rf (en cualquier forma) en una respuesta SO sin alguna señal de advertencia REALMENTE Atemorizante. Algún usuario inexperto podría venir aquí buscando la "marca de verificación verde" (generalmente la mejor respuesta) y luego copiar y pegar este comando y poof ... ahí va su arduo trabajo en el directorio actual. Por cierto: rm -rf ./.*es "más seguro" si solo elimina los archivos y directorios ocultos (punto) en el directorio actual (tal como @stackunderflow declaró antes que yo). Pero rm -rfes un comando peligroso para los usuarios inexpertos, ¡así que ten cuidado! Solo mis 2 centavos.
Andrew
funciona en 1.7.1 La única carpeta dentro era .gitdespués git init(lo sabía)
vladkras
No necesita -rfeliminar archivos normales. Considere eliminar esta respuesta o al menos aceptar una diferente.
Navin
6

Mejorando la respuesta de @ GoZoner:

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

El comando shopt se toma de esta respuesta SO y cambia el comportamiento del comando 'mv' en Bash para incluir archivos de puntos, que deberá incluir el directorio .git y cualquier otro archivo oculto.

También tenga en cuenta que esto solo se garantiza que funcione tal cual si el directorio actual (.) Está vacío, pero funcionará siempre que ninguno de los archivos en el repositorio clonado tenga el mismo nombre que los archivos en el directorio actual. Si no le importa lo que hay en el directorio actual, puede agregar la opción -f (force) al comando 'mv'.

phatblat
fuente
6

Tenía esta misma necesidad. En mi caso, tenía una carpeta web estándar creada por la instalación de un servidor web. Para los propósitos de esta ilustración, digamos que esto es

/server/webroot

y webroot contiene otros archivos y carpetas estándar. Mi repositorio solo tiene los archivos específicos del sitio (html, javascript, CFML, etc.)

Todo lo que tuve que hacer fue:

cd /server/webroot

git init

git pull [url to my repo.git]

Debe tener cuidado al hacer git init en la carpeta de destino porque si NO lo hace, sucederá una de dos cosas:

  1. El git pull simplemente fallará con un mensaje sobre ningún archivo git, en mi caso:

fatal: no es un repositorio git (ni ninguno de los directorios principales): .git

  1. Si no es un archivo en algún lugar .git en la ruta de los padres a la carpeta de tu repositorio tirado se creará en ese padre que contiene el archivo .git. Esto me sucedió y me sorprendió ;-)

Esto NO molestó ninguno de los archivos "estándar" que tengo en mi carpeta webroot, pero sí tuve que agregarlos al archivo .gitignore para evitar la adición inadvertida de ellos a las confirmaciones posteriores.

Esto parece una manera fácil de "clonar" en un directorio no vacío. Si no desea los archivos .git y .gitignore creados por la extracción, simplemente elimínelos después de la extracción.

igeocacher
fuente
5

Mejorando aún más la respuesta de @ phatblat :

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

como un trazador de líneas:

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

166_MMX
fuente
2
shopt -s dotglob
git clone ssh://[email protected]/home/user/private/repos/project_hub.git tmp && mv tmp/* . && rm -rf tmp
John Josef
fuente
3
Proporcione más información para explicar por qué su código soluciona el problema y qué hace.
Martin
"git clone ... tmp": crea la carpeta / tmp en el directorio donde se ejecuta el comando y clona el repositorio de Git. Entonces "mv tmp / *". - mueve todos los archivos de la carpeta / tmp en la carpeta principal (donde se ejecutó el comando anterior) y finalmente "rm -rf tmp" - elimina la carpeta / tmp.
Marinski
1

use. (punto) al final de su comando como a continuación

URL de clonación de git .

Upendra
fuente
Esto no funciona en mac, causa error: fatal: destination path '.' already exists and is not an empty directory.
Pedro Luz
Para mac :: Debería en el directorio principal y luego usar el nombre de la carpeta en lugar de. (Punto) como a continuación git clone URL flodername Asegúrese de que su carpeta esté vacía.
Upendra
0

Aquí fue lo que encontré:

Veo esto:

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

Entre mis búsquedas, me topé con:

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

Busque la entrada de Clinton. Hall ... Si intenta esto (como lo hice), probablemente obtendrá la access deniedrespuesta, allí estaba mi primera pista, por lo que el error inicial (para mí), en realidad, estaba eludiendo a la raíz incorrecta problema.

Solución para esto en Windows: asegúrese de ejecutar cmdo git elevated, luego, ejecute:

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

Lo anterior fue mi problema y simplemente elevarme funcionó para mí.

ynotjs
fuente
0

La solución Windowses clonar el repositorio en otra carpeta y luego copiar y pegar en la ubicación original o simplemente copiar la .gitcarpeta invisible.

croppio.com
fuente
-1

Eliminar con

rm -rf. *

puede meterte en problemas o algunos errores más.

Si tiene / ruta / a / carpeta, y desea eliminar todo lo que hay dentro, pero no esa carpeta, simplemente ejecute:

rm -rf / ruta / a / carpeta / *

Sid
fuente
-1

Así que solucioné este mismo error eliminando la carpeta oculta .git en mi directorio raíz y luego agregué un punto al 'repositorio de clones de git'. en mi carpeta raíz / dist. Esto está en el contexto de un proyecto de paquete web vue-cli. Entonces, lo que todos los demás dicen es correcto, ¡generalmente significa que tiene un seguimiento de git en la carpeta en la que está tratando de clonar o en la carpeta principal o raíz de la carpeta en cuestión!

Akin Hwan
fuente
-1
git clone ssh://[email protected]/home/user/private/repos/project_hub.git $(pwd)
Catalin
fuente
Tenga en cuenta que esto todavía dará como resultado el mismo error publicado en la pregunta (" fatal: la ruta de destino 'resuelta / ruta / de / pwd' ya existe y no es un directorio vacío ") si está haciendo esto en un sitio no vacío directorio.
Gino Mempin
-2

es útil crear un nuevo archivo mkdir filenamey luego ejecutar el comando de git clone xxxxx, funciona en mi computadora

Qi más loco
fuente
-3

He visto esta pregunta muchas veces, y solo quiero señalar que git pulldesde su directorio hará el truco.

A menos que me falte algo aquí, eso funcionó para mí.

Itamar
fuente
55
git pullno hará nada si no tiene un repositorio definido, que es una parte crítica de lo que git clonehace.
Hackel