Tengo una copia de trabajo del proyecto, sin ningún metadato de control de origen. Ahora, me gustaría hacer el equivalente de git-clone en esta carpeta y mantener mis cambios locales.
git-clone no me permite clonar en una carpeta existente. ¿Cuál es la mejor práctica aquí?
Respuestas:
Esto se puede hacer clonando a un nuevo directorio, luego moviendo el
.git
directorio a su directorio existente.Si su directorio existente se llama "código".
Esto también se puede hacer sin realizar un pago durante el comando clonar; Más información se puede encontrar aquí .
fuente
git clone
como primer comando, no se necesita más comando de pago. Si en su lugar usa algo comogit clone --no-checkout
en ese primer paso, luego de mover el directorio .git será necesario usarlogit reset HEAD
para decirle a git que los archivos no se han eliminado.git status
.No clones, busca en su lugar. En el repositorio:
Luego puede restablecer el árbol para obtener la confirmación que desea:
y eres como clonado
La pregunta interesante aquí (y la que no tiene respuesta): cómo averiguar en qué compromiso se basó su árbol desnudo, por lo tanto, en qué posición restablecer.
fuente
Lo siguiente que hice, para pagar la rama maestra en un directorio existente:
fuente
-t
se usa la bandera aquí?Me gustaría
git clone
a un nuevo directorio y copiar el contenido del directorio existente al nuevo clon.fuente
git clone wherever tmp && git mv tmp/.git . && rm -rf tmp
En otras palabras, mover el.git
directorio de un clon temporal parece más simple que limpiar el árbol de trabajo del clon y copiar los archivos existentes allí.git mv tmp/.git .
regresafatal: cannot move directory over file, source=tmp/.git, destination=.git
por mí. Alguien sabe cuál es el problema?mv
, nogit mv
; aunque esto no explica por qué ya tiene un.git
archivo allí (que contienegitdir: some/path/to/a/git-dir
un "archivo git"; si no estuviera allí, entonces lo habría vistofatal: Not a git repository (or any of the parent directories): .git
).El uso de un directorio temporal está bien, pero esto funcionará si desea evitar ese paso. Desde la raíz de su directorio de trabajo:
fuente
git reset --hard origin/master
eliminará todos los archivos locales.hard
ymixed
es que mixto mantendrá los cambios locales (por lo tanto, si luego intentas tirar, te mostrará, por ejemplo, no se puede tirar con rebase: tienes cambios no organizados. Compruébalo o guárdalos ) , aunque difícil descartará esos cambios localesfuente
git reset --hard
eliminará los cambios en el archivo local, específicamente NO lo que solicitó este OP.--mixed
debería usarse en su lugar.Para clonar un repositorio git en un directorio existente vacío, haga lo siguiente:
Observe el
.
al final de sugit clone
comando. Eso descargará el repositorio en el directorio de trabajo actual.fuente
fatal: destination path '.' already exists and is not an empty directory.
Muchas respuestas ya para hacerlo de la manera en que lo solicitó el OP. Pero vale la pena señalar que hacerlo al revés es mucho más simple:
Ahora tiene el estado objetivo deseado: clon fresco + cambios locales.
fuente
Hay dos enfoques para esto. Siempre que sea posible, comenzaría con una carpeta limpia para su nuevo directorio de trabajo de git y luego copiaría su versión de las cosas más adelante. Esto podría parecerse a *:
En este punto, debe tener una copia de trabajo bastante limpia con su carpeta de trabajo anterior como el directorio de trabajo actual, por lo que cualquier cambio que incluya la eliminación de archivos aparecerá en el radar si ejecuta
git status
.Por otro lado, si realmente debe hacerlo al revés, puede obtener el mismo resultado con algo como esto:
De cualquier manera, lo primero que haría es ejecutar algo como
git stash
obtener una copia de todos sus cambios locales, luego puede volver a aplicarlos y determinar a través de cuáles desea comprometerse.* Ambos ejemplos asumen que comienzas en el shell en el directorio principal de tu proyecto.
fuente
Este es el mejor de todos los métodos que encontré
Clone solo la carpeta .git del repositorio (excluyendo archivos ya que están en
existing-dir
) en un directorio temporal vacíogit clone --no-checkout repo-path-to-clone existing-dir/existing-dir.tmp
// podría querer --no-hardlinks para clonar repositorio localMueva la carpeta .git al directorio con los archivos. Esto hace
existing-dir
un repositorio git.mv existing-dir/existing-dir.tmp/.git existing-dir/
Eliminar el directorio temporal
rmdir existing-dir/existing-dir.tmp
cd existing-dir
Git piensa que todos los archivos se eliminan, esto revierte el estado del repositorio a HEAD.
ADVERTENCIA: cualquier cambio local en los archivos se perderá.
git reset --mixed HEAD
fuente
Si está utilizando al menos git 1.7.7 (que enseñó
clone
la--config
opción), para convertir el directorio actual en una copia de trabajo:Esto funciona por:
.git
carpeta--mirror
convierte el nuevo clon en una carpeta puramente de metadatos como.git
necesario--config core.bare=false
contradice lo implícitobare=true
de la--mirror
opción, permitiendo así que el repositorio tenga un directorio de trabajo asociado y actúe como un clon normalObviamente, esto no funcionará si
.git
ya existe un directorio de metadatos en el directorio que desea convertir en una copia de trabajo.fuente
[core]
sección de la configuración local que incluye ambosbare = true
ybare = false
. Más problemático es que tendrá valores incorrectos para elorigin
control remoto, con la[remote "origin"]
sección incluidamirror = true
y una especificación de búsqueda que no funcionará correctamente con una copia de trabajo. Después de solucionar estos problemas, clonar normalmente y mover las nuevas copias de trabajo.git
habrá sido más eficiente.Por lo general, clonaré primero el repositorio inicial y luego moveré todo el contenido de la carpeta existente al repositorio inicial. Funciona todo el tiempo.
La ventaja de este método es que no se perderá nada del repositorio inicial, incluido README o .gitignore.
También puede usar el siguiente comando para finalizar los pasos:
fuente
Puede hacerlo escribiendo las siguientes líneas de comando de forma recursiva:
fuente
Solo usa el. al final del
git clone
comando (estar en ese directorio), así:fuente