usar tener tag repositorios repositorio remove qué proyecto podemos partir para otro oneline nuevo nuestros mayor los log herramienta hacer hace cómo crear control califican git

tener - ¿qué hace git log-oneline?



¿Cómo se puede usar de forma segura una base de datos de objetos compartidos en git? (2)

He leído en varios lugares que es posible compartir el directorio de objects entre varios repositorios de git, por ejemplo, con enlaces simbólicos. Me gustaría hacer esto para compartir las bases de datos de objetos entre varios repositorios en el mismo directorio:

shared-objects-database/ foo.git/ objects -> ../shared-objects-database bar.git/ objects -> ../shared-objects-database baz.git/ objects -> ../shared-objects-database

(Estoy haciendo esto porque de lo contrario habrá muchos blobs grandes almacenados de forma redundante en cada directorio de objetos).

Mi preocupación acerca de esto es que cuando se utilizan estos repositorios, se llamará automáticamente a git gc y se eliminarán los objetos que no son accesibles desde un repositorio, lo que hará que los otros repositorios estén incompletos. ¿Hay alguna manera fácil de asegurar que esto no suceda? Por ejemplo, ¿existe una opción de configuración que obligue a --no-prune a ser la predeterminada para git gc , y, de ser así, sería suficiente para usar esta configuración sin correr el riesgo de perder datos?

En este momento, he estado usando el mecanismo de objects/info/alternates para compartir objetos entre estos repositorios, pero mantener estos punteros de cada repositorio a todos los demás es un poco arriesgado.

(Mi otra alternativa es tener un solo repositorio simple, con todas las ramas de foo.git , bar.git y baz.git llamadas foo-master , foo-testing , bar-master , etc. Sin embargo, eso era ser un poco más de trabajo para administrar, por lo que si el directorio de objetos de enlaces simbólicos puede funcionar de manera segura, prefiero hacerlo.)

Puede suponer que este es uno de esos casos de uso de Git para lo que no fue previsto, pero espero que la pregunta sea clara y válida a pesar de todo;)


¿Por qué no solo arrancar la variable gc.pruneExpire a never ? Es poco probable que alguna vez tengas objetos sueltos de 1000 años de antigüedad que no desees eliminar.

Para asegurarte de que las cosas que realmente deberían podarse se poden, puedes mantener un repo que tenga todos los demás como controles remotos. git gc sería bastante seguro en eso, ya que realmente sabe lo que es inalcanzable.

Edit: Bueno, yo era un poco arrogante sobre el límite de tiempo; Como se señala en los comentarios, 1000 años no van a funcionar muy bien, pero el comienzo de la época lo haría, o never .


Tal vez esto se agregó a git después de que esta pregunta fuera respondida: parece que ahora hay una manera de hacerlo explícitamente. Se describe aquí:

https://git.wiki.kernel.org/index.php/Git_FAQ#How_to_share_objects_between_existing_repositories.3F

¿Cómo compartir objetos entre repositorios existentes? Hacer

echo "/source/git/project/.git/objects/" > .git/objects/info/alternates

y luego seguir con

git repack -a -d -l

donde el -l significa que solo colocará objetos '''' locales '''' en el archivo de paquete (estrictamente hablando, también pondrá cualquier objeto suelto del árbol alternativo, por lo que tendrá un archivo completamente lleno, pero ganó no duplique objetos que ya están empaquetados en el árbol alternativo).