¿Cómo puedo configurar la twig de Git para copys de security automáticas?

Me doy count de que ya hay preguntas sobre cómo hacer una copy de security de un repository (y la respuesta suele ser git bundle ), pero tenía como objective la configuration específica.

Intentaba periódicamente enviar una "instantánea" de la twig actual a otra twig con fines de copy de security. Estoy usando un file por lotes, y se ve así (he intentado más variaciones de las que puedo enumerar aquí):

 git stash git checkout backup git add . git commit -m "Automatic Backup %Time%" git push --all origin git stash pop git checkout - 

El comportamiento que bash es que cada confirmación sea una instantánea exacta del estado actual del directory, independientemente de la twig que haya revisado cuando la ejecuto. Si un commit más reciente cambia un file, quiero que tenga prioridad si surge un conflicto de fusión.

En realidad, no estoy tratando de fusionar sucursales, solo estoy tratando de get los files tal como existen en el momento de la instantánea en el disco. Entonces, si la twig A tiene un cambio en el file A, y la twig B tiene un cambio conflictivo en el mismo file, pero la twig B está desprotegida, la twig de respaldo debería terminar obteniendo los cambios de la twig B, que están actualmente en el file del disco ignorando cualquier otra cosa

Y un ejemplo práctico (?) De lo que estoy tratando de hacer: decir Branch A tiene "myfile.txt" como "Hello World", y Branch B tiene "myfile.txt" como "Hello Dave".

Cuando pago la Sucursal A y abro "myfile.txt" en un editor de text, espero que tenga "Hello World". Cuando pago en B, espero que tenga "Hello Dave".

Si dentro de una twig commit 1 tenía "Hello World", y 2 tenían "Hello Dave" no habría un conflicto. Quiero que mi twig de respaldo termine con la confirmación 1 que contiene "Hola mundo", y la confirmación 2 que contiene "Hola Dave", suponiendo que se produjo la confirmación 1 mientras que yo había verificado la twig A, y la twig B cuando se produjo la confirmación 2.

Creo que git stash es la key de lo que estoy haciendo, pero simplemente no está funcionando. Probé varias combinaciones diferentes de esos commands, y todos ellos devolvieron diferentes variaciones de errores, en diferentes puntos, mientras que el repository se encontraba en varios estados, por lo que es realmente difícil resumirlos. Diría que mi enfoque probablemente sea fundamentalmente incorrecto, por lo que los commands enumerados están ahí para dar una image de lo que he intentado hasta ahora.

Pero no importa lo que haga, o bien obtengo conflictos de fusión o no me comprometo. ¿Qué me estoy perdiendo? (Si hay información adicional que puedo proporcionar, házmelo saber)

Me parece que desea hacer una copy de security automática de los contenidos del directory de trabajo como una nueva confirmación en la twig de backup y enviar todas las twigs al origin .

En ese caso, no desea checkout la twig de la backup porque eso cambiaría el contenido de su directory de trabajo. En su lugar, querrá usar alguna combinación de git read-tree , git update-index y git commit-tree para fabricar una nueva confirmación para su twig de backup y luego usar git branch -f para agregar la confirmación recién creada a la backup twig. Después de eso, puedes continuar haciendo push regular al origin .

Enlaces: http://alx.github.io/gitbook/7_raw_git.html

Actualizar:

Creo que la manera más fácil de hacer esto es así (suponiendo que ya tienes una twig llamada backup ):

 #!/bin/bash BRANCH=backup export GIT_INDEX_FILE=/tmp/git-backup-index.$$ git add . git commit-tree $(git write-tree) -p $(git show-ref --hash --heads $BRANCH) -m "Automatic backup" | xargs git branch -f $BRANCH rm -f "$GIT_INDEX_FILE" 

(Tenga en count que no he probado el script anterior …)

Por qué necesitarías hacer esto está más allá de mí.

Puede usar git config core.logAllRefUpdates true . Esto hará que Git mantenga una historia perfecta de todas las twigs en todas partes. Incluso puede ajustarlo para que nunca caduque y tendrá un historial perfecto de cada twig (y no solo cuando recuerde hacer una copy de security).


Si realmente desea hacerlo, puede hacer que el índice contenga el tree que desea y luego confirmarlo.

  1. Cambiar a la copy de security de la sucursal de git stash; git checkout backup sucursal git stash; git checkout backup
  2. Borrar el índice git rm -fr --cached .
  3. Copie en el índice el tree de la confirmación que desea respaldar
    git ls-tree branchA | git update-index --index-info
  4. Confirme los resultados git commit -m "Backup of branchA" (No use -a !)
  5. Regresa a donde viniste de la git checkout -f branchB; git stash pop de git checkout -f branchB; git stash pop git checkout -f branchB; git stash pop . Necesita usar -f porque la copy de trabajo dirá que está sucio.

Esto nunca tendrá ningún conflicto de fusión, porque no estás fusionando nada. Cada confirmación en copy de security representará exactamente las twigs de las copys de security realizadas en ese momento.


Aquí hay un ejemplo.

 $ mkdir example $ cd example $ git init Initialized empty Git repository in /tmp/example/.git/ $ echo "First change" > file1 $ git add file1 $ git commit -am "file1 first change" [master (root-commit) f071d01] file1 first change 1 file changed, 1 insertion(+) create mode 100644 file1 $ git branch master_two $ git checkout master_two Switched to branch 'master_two' $ sed -is/First/Two/g file1· $ git commit -am "Two change" [master_two b786d88] Two change 1 file changed, 1 insertion(+), 1 deletion(-) $ git checkout master Switched to branch 'master' $ sed -is/First/Second/g file1 $ git commit -am "Second change" [master d88ca84] Second change 1 file changed, 1 insertion(+), 1 deletion(-) $ git checkout --orphan backup Switched to a new branch 'backup' $ git rm -fr --cached . rm 'file1' $ git ls-tree master | git update-index --index-info $ git commit -am "snapshot of master" [backup (root-commit) 7af271d] snapshot of master 1 file changed, 1 insertion(+) create mode 100644 file1 $ git rm -fr --cached . rm 'file1' $ git ls-tree master_two | git update-index --index-info $ git commit -m "snapshot of master_two" [backup a3ddfdd] snapshot of master_two 1 file changed, 1 insertion(+), 1 deletion(-) $ git checkout -f master Switched to branch 'master' 

El problema es que estás tratando de hacer que git pretenda que todas tus twigs pueden coexistir en una única twig (a la que llamas copy de security). ¡Así que, en efecto, estás fusionando todo, y es natural que tengas conflictos!

Solo para aclarar, he aquí un ejemplo: tiene la twig a, con el file f que contiene el text "a", y la twig b que tiene el file f que contiene "b". Trabaja en la twig a, se realiza una copy de security automática y almacena f = "a" en la twig de respaldo. Luego trabajas en la twig b por cualquier razón, y se realiza una copy de security automática, y ahora estás tratando de almacenar f = "b". Este es un conflicto de fusión porque no existe relación entre las twigs a y b (tal vez ambas henetworkingaron el file f de la twig prod donde el file f contiene "prod", y lo cambiaron a "a" y "b", respectivamente).

Si desea tomar instantáneas de lo que hay en su directory en un momento dado, desea usar tags, y probablemente desee poner la hora en que se tomó la label como parte del nombre de la label, como workdir-snapshot-20140818-1432.

Recuerde que las twigs son solo indicadores de confirmaciones, por lo que usar el término "copy de security" es realmente engañoso, realmente no está copyndo datos, lo máximo que está haciendo un seguimiento es qué twig fue extraída a su disco de trabajo en un momento dado, eso es todo .