tab - git tags best practices
¿Cómo convierto un repositorio de Git desnudo en uno normal(in situ)? (7)
Tengo un repositorio de git simple, pero necesito acceder y explorar sus contenidos a través de ssh (en un administrador de archivos como la experiencia del usuario).
Supongo que podría clonarlo:
git clone -l <path_to_bare_repo> <new_normal_repo>
Sin embargo, mi repositorio tiene un tamaño de aproximadamente 20 GB y no tengo espacio para duplicarlo. ¿Hay alguna manera de convertir el repositorio vacío en el lugar para terminar con una copia de trabajo en él?
La pregunta del cartel original es sobre no tener espacio suficiente para hacer las cosas de la manera más simple. Para aquellos que tienen suficiente espacio, la respuesta es mucho más simple:
git clone foo.git foo
Para simplificar y combinar la información en las respuestas:
Hay dos diferencias que hacen que un repositorio simple sea diferente de una carpeta .git normal:
- core.bare se establece en true en el archivo de configuración
- archivo de índice y árbol de trabajo no existen
Entonces, simplemente puede mover su repositorio simple para que sea la subcarpeta .git de una nueva carpeta,
mkdir clone
mv bare.git clone/.git
Cambiar core.bare:
cd clone
git config --local --bool core.bare false
Y genere el archivo de índice y el árbol de trabajo:
git checkout master
Recomiendo la git checkout
lugar de git reset
para generar los archivos, en caso de que se escriba accidentalmente en el lugar equivocado.
Si no te importa trabajar en diferentes worktree, entonces
git worktree add ../repo2
cd ..
git status # now works fine
Tenga en cuenta que esto no es un clon.
Si tiene poco espacio de disco, expandir el árbol de trabajo mediante la conversión a un repositorio normal será un problema, pero puede navegar por los contenidos de un repositorio simple sin convertirlo. Use git cat-file -p <commit-sha>
en cualquier confirmación para ver el árbol al que se refiere. Use git cat-file -p <blob-sha>
para ver el contenido del archivo al que hace referencia el blob. Usa git show <sha>:path
donde sha es una confirmación o un árbol para ver el contenido de la burbuja en la ruta.
Tuve un escenario ligeramente diferente:
- un non-repo ( obtener a través de un tarball de github )
- la necesidad de restaurar un repositorio completo de ese contenido.
Solución:
- clonar un repositorio desnudo en ese contenido, en un directorio
.git
:
git clone --bare https://github.com/user/project .git
- Marcarlo como un repositorio no desnudo:
git config --local --bool core.bare false
- restablecer el índice (de lo contrario, cree que todo se ha eliminado, ya que un
.git
bare repo no incluye un archivo ''index
'').
git reset HEAD -- .
Eso restaura el.git/index
.
He transformado efectivamente un repositorio desnudo en uno no desnudo, conservando el contenido que había obtenido previamente.
La secuencia de comandos completa que he estado utilizando durante años implica los pasos:
cd /path/to/current/worktree
# That creates a .git directly at the right place
git clone --bare /url/of/repo .git
# restore the link between the local repo and its upstream remote repo
git config --local --bool core.bare false
git config --local remote.origin.fetch +refs/heads/*:refs/remotes/origin/*
git fetch origin
git branch -u origin/master master
# reset the index (not the working tree)
git reset HEAD -- .
Pero reconozco que la solución aceptada (con el útil paso de git reset
agregado por ADTC ) es más simple.
cd en repo al descubierto y hacer
git config core.bare false
git reset --hard
o
git clone X.git X
(te dará un repositorio git regular que se llama X)
Nota : Probé esto en un repositorio 1-commit muy simple . Vuelva a verificar esto, lea las páginas de manual y siempre esté contento de haber hecho una copia de seguridad antes de seguir los consejos que encontró en . (Usted hace una copia de seguridad, ¿verdad?)
Para convertir un repositorio de --bare
en un no-descubierto:
- Cree una carpeta
.git
en el nivel superior de su repositorio. - Mueva los elementos de administración del repositorio (
HEAD branches config description hooks info objects refs
etc.) al.git
que acaba de crear. - Ejecute
git config --local --bool core.bare false
para convertir el repositorio git local en no visible. - (a través del comentario de Tamás Pap ) Después del paso # 3 verá que está en la rama
master
(o cualquiera de las ramas principales) y todos sus archivos se eliminan y la eliminación se realiza. Eso es normal. Simplementegit reset --hard
manualmentemaster
, o haga ungit reset --hard
, y listo.
Estos pasos están en la dirección opuesta a esta pregunta , "git-convert normal al depósito vacío" - en particular, tenga en cuenta esta respuesta , que establece que los pasos anteriores (en, supongo, en cualquier dirección) son diferentes de hacer un git-clone
. Sin embargo, no estoy seguro si eso es relevante para ti, pero mencionaste git clone
en la pregunta.