tag tab practices crear commits commands best git git-bare

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:

  1. Cree una carpeta .git en el nivel superior de su repositorio.
  2. Mueva los elementos de administración del repositorio ( HEAD branches config description hooks info objects refs etc.) al .git que acaba de crear.
  3. Ejecute git config --local --bool core.bare false para convertir el repositorio git local en no visible.
  4. (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. Simplemente git reset --hard manualmente master , o haga un git 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.