Deshuesado repository Git con files rastreados

Quiero hacer una copy de security de un proyecto versionado de Git, incluidos los cambios al directory de trabajo, y un puntero al repository remoto.

La carpeta respaldada debe contener los files del directory de trabajo y los files .git necesarios para permitir al usuario navegar al proyecto y ejecutar git pull (u otro command git) de forma segura. No importa si el directory remoto necesita ser descargado nuevamente y verificar la "integridad" con el directory de trabajo.

No puedo hacer una copy de security de toda la carpeta .git, ya que contiene files muy grandes.

Intenté estos commands:

  • git --aggressive
  • git reflog expire --expire=now --all
  • git repack -ad
  • git prune

Pero todavía dejan files grandes (> 200 MB) *.pack en la carpeta .git/objects/pack .

  • Traté de eliminar la carpeta de objects pero eso hace que el repository sea inválido: fatal: Not a git repository (or any of the parent directories): .git .
    • git init después de eliminar la carpeta de objects , pero eso da el error fatal: bad object HEAD , y no puedo hacer ningún otro command.
  • Traté de eliminar todos los files y carpetas dentro de .git , a exception de .git/config , y aún no es un repository válido de git.
    • git init después de eliminar esas carpetas, pero luego los cambios en el directory de trabajo se "desvían", a pesar de que son los mismos files en el repository remoto, así que estoy obligado a ejecutar git clean -fd y download el repository de nuevo .

¿Hay alguna manera de crear un repository de Git puro, con un mínimo de files de package, mientras se mantiene el estado "rastreado" del directory de trabajo?

Puedes crear:

  • un file del tree de trabajo:

     zip -r myrepo.zip myrepo -x *.git* 
  • un package del .git repo (como se explica aquí ):

     cd myrepo git bundle create /tmp/repositoryname.bundle --all 

Eso le daría dos files (más fácil de copyr sobre cualquier location que desee), con el tamaño mínimo.
Pero si su repository es grande, es posible que desee crear un package incremental, con solo los últimos commits (siempre que la location de destino donde pueda usar ese package ya tenga el rest del historial)

Los files de package en .git/objects contienen el historial de las versiones anteriores. Si desea hacer una copy de security de git repo con los cambios del directory de trabajo, debe mantener los files del package integrados. También hay una manera de llevarlo al repository desnudo y luego clonarlo en cualquier lugar que desee. Detalle los pasos a continuación:

  1. Crea un repository git init --bare para la copy de security con git init --bare .
  2. Empuje el repository al repository desnudo:

git remote add backup <path for bare repo> git push backup --all

En la ruta de repos repo, agregue la información repo remota en el file .git/config :

 [remote "origin"] url = <remote repo URL> fetch = +refs/heads/*:refs/remotes/origin/* 
  1. Clona el repository de copy de security en cualquier lugar que quieras por git clone <path for bare repo> . En el repository clonado, si desea que los cambios pasen directamente al repository remoto, puede cambiar la URL en .git/config o usar git remote set-url origin <remote URL> .