tipos tag repositorio example etiquetas eliminar crear git version-control git-clone git-bare git-non-bare-repository

tag - ¿Cómo convertir un repositorio Git normal a uno desnudo?



git push tag (16)

¿Cómo puedo convertir un repositorio Git ''normal'' a uno desnudo?

La principal diferencia parece ser:

  • en el repositorio normal de git tienes una carpeta .git dentro del repositorio que contiene todos los datos relevantes y todos los demás archivos construyen tu copia de trabajo

  • en un repositorio Git simple, no hay una copia de trabajo y la carpeta (llamémoslo repo.git ) contiene los datos reales del repositorio


A menos que específicamente desee o necesite dividir bits en el sistema de archivos, es realmente sencillo crear una versión simple de un repositorio no desnudo (mencionado en varias otras publicaciones aquí). Es parte de la funcionalidad principal de git:

git clone --bare reponame bare_reponame


Aquí hay una pequeña función BASH que puede agregar a su .bashrc o .profile en un sistema basado en UNIX. Una vez que se agrega y el shell se reinicia o el archivo se vuelve a cargar a través de una llamada a source ~/.profile o source ~/.bashrc .

function gitToBare() { if [ -d ".git" ]; then DIR="`pwd`" mv .git .. rm -fr * mv ../.git . mv .git/* . rmdir .git git config --bool core.bare true cd .. mv "${DIR}" "${DIR}.git" printf "[/x1b[32mSUCCESS/x1b[0m] Git repository converted to " printf "bare and renamed to/n ${DIR}.git/n" cd "${DIR}.git" else printf "[/x1b[31mFAILURE/x1b[0m] Cannot find a .git directory/n" fi }

Una vez llamado dentro de un directorio que contiene un directorio .git, realizará los cambios apropiados para convertir el repositorio. Si no hay un directorio .git presente cuando se le llama, aparecerá un mensaje de FALLO y no se producirán cambios en el sistema de archivos.



En caso de que tenga un repositorio con pocas sucursales / refs / heads / * localizadas y pocos remotos remotos / origin / * Y si desea convertir esto en un repositorio BARE con todas las sucursales en / refs / heads / *

Puedes hacer lo siguiente para guardar el historial.

  1. crear un repositorio simple
  2. Cd en el repositorio local que tiene sucursales locales desprotegidas y sucursales remotas
  3. git push / path / to / bare / repo + refs / remotes / origin / : refs / heads /

En resumen: reemplace el contenido del repo con el contenido del repo/.git , luego diga al repositorio que ahora es un repositorio simple.

Para ello, ejecuta los siguientes comandos:

cd repo mv .git ../repo.git # renaming just for clarity cd .. rm -fr repo cd repo.git git config --bool core.bare true

Tenga en cuenta que esto es diferente de hacer un git clone --bare a una nueva ubicación (ver más abajo).


Esto es lo que creo que es más seguro y simple. No hay nada aquí no mencionado anteriormente. Solo quiero ver una respuesta que muestre un procedimiento seguro paso a paso. Inicia una carpeta desde el repositorio (repo) que desea dejar al descubierto. He adoptado la convención implícita anterior de que las carpetas de repositorio simples tienen una extensión .git.

(1) Backup, just in case. (a) > mkdir backup (b) > cd backup (c) > git clone ../repo (2) Make it bare, then move it (a) > cd ../repo (b) > git config --bool core.bare true (c) > mv .git ../repo.git (3) Confirm the bare repository works (optional, since we have a backup) (a) > cd .. (b) > mkdir test (c) > cd test (d) > git clone ../repo.git (4) Clean up (a) > rm -Rf repo (b) (optional) > rm -Rf backup/repo (c) (optional) > rm -Rf test/repo


He leído las respuestas y he hecho esto:

cd repos mv .git repos.git cd repos.git git config --bool core.bare true # from another answer cd ../ mv repos.git ../ cd ../ rm -rf repos/ # or delete using a file manager if you like

esto dejará los contenidos de repos/.git como los repos.git desnudos repos.git


Los métodos que dicen eliminar archivos y eliminarlos al mover el directorio .git no son limpios y no se usa el método "git" para hacer algo que debería ser simple. Este es el método más limpio que he encontrado para convertir un repositorio normal en un repositorio simple.

Primer clon / ruta / a / normal / repo en un repositorio simple llamado repo.git

git clone --bare /path/to/normal/repo

Luego elimine el origen que apunta a / ruta / a / normal / repo

cd repo.git git remote rm origin

Finalmente puedes quitar tu repo original. Puede cambiar el nombre de repo.git a repo en ese punto, pero la convención estándar para indicar un repositorio git es algo, por lo que personalmente lo dejaría así.

Una vez que haya hecho todo eso, puede clonar su nuevo repositorio simple (que en efecto crea un repositorio normal, y también es cómo lo convertiría de simple a normal)

Por supuesto, si tiene otros upstreams, querrá tomar nota de ellos y actualizar su repositorio para incluirlo. Pero una vez más, todo se puede hacer con el comando git. Recuerda que las páginas de manual son tus amigas.


Oneliner para hacer todas las operaciones anteriores:

for i in `ls -A .`; do if [ $i != ".git" ]; then rm -rf $i; fi; done; mv .git/* .; rm -rf .git; git config --bool core.bare true

(No me culpes si algo explota y no tuviste copias de seguridad: P)


Por favor también considere usar

git clone --mirror path_to_source_repository

De la documentation :

Configurar un espejo del repositorio de origen. Esto implica --bare. Comparado con --bare, --mirror no solo asigna las ramas locales de la fuente a las sucursales locales del destino, sino que también asigna todas las referencias (incluidas las ramas de seguimiento remoto, notas, etc.) y configura una configuración de refspec tal que todas estas referencias se sobrescriben con una actualización remota de git en el repositorio de destino.


Primero, backup su repositorio existente:

(a) mkdir backup (b) cd backup (c) git clone non_bare_repo

Segundo, ejecuta lo siguiente:

git clone --bare -l non_bare_repo new_bare_repo


Simplemente leer

Pro Git Book: 4.2 Git en el servidor - Obteniendo Git en un servidor

que se reduce a

$ git clone --bare my_project my_project.git Cloning into bare repository ''my_project.git''... done.

Luego ponga my_project.git al servidor

Lo que principalmente es, qué respuesta #42 trató de señalar. Shurely se podría reinventar la rueda ;-)


Solo quería ingresar a un repositorio en una ruta de red, pero git no me dejaría hacer eso a menos que ese repositorio estuviera marcado. Todo lo que necesitaba era cambiar su configuración:

git config --bool core.bare true

No es necesario que juegues con los archivos a menos que quieras mantenerlos limpios.


Tu método parece que funcionaría; la estructura de archivos de un repositorio simple es justo lo que está dentro del directorio .git. Pero no sé si alguno de los archivos realmente se ha cambiado, así que si eso falla, puedes hacerlo

git clone --bare /path/to/repo

Probablemente deba hacerlo en un directorio diferente para evitar un conflicto de nombres, y luego puede volver a moverlo a donde desee. Y es posible que deba cambiar el archivo de configuración para que apunte a donde sea que esté su repositorio de origen.


Utilicé la siguiente secuencia de comandos para leer un archivo de texto que tiene una lista de todos mis repositorios SVN y los convierto a GIT, y luego uso git clone --bare para convertir a un repositorio git simple

#!/bin/bash file="list.txt" while IFS= read -r repo_name do printf ''%s/n'' "$repo_name" sudo git svn clone --shared --preserve-empty-dirs --authors-file=users.txt file:///programs/svn/$repo_name sudo git clone --bare /programs/git/$repo_name $repo_name.git sudo chown -R www-data:www-data $repo_name.git sudo rm -rf $repo_name done <"$file"

list.txt tiene el formato

repo1_name repo2_name

y users.txt tiene el formato

(no author) = Prince Rogers <[email protected]>

www-data es el usuario del servidor web Apache, se necesita permiso para impulsar cambios a través de HTTP


Wow, es simplemente sorprendente la cantidad de personas que se interesaron en esto, especialmente considerando que no parece que ni un solo se haya detenido a preguntar por qué esta persona está haciendo lo que está haciendo.

La ÚNICA diferencia entre un repositorio git desnudo y no desnudo es que la versión no desnuda tiene una copia de trabajo. La razón principal por la que necesitaría un repo simple es que si quisiera ponerlo a disposición de un tercero, no pueda trabajar directamente en él, por lo que en algún momento tendrá que clonarlo, en qué momento lo hará. De vuelta a una versión de copia de trabajo regular.

Dicho esto, para convertir a un repositorio simple, todo lo que tienes que hacer es asegurarte de que no tengas confirmaciones pendientes y luego solo:

rm -R * && mv .git/* . && rm -R .git

Ahí tienes, repo desnudo.