¿Cómo permite Github la edición de files en línea? (O cómo agregar o editar files en un repository bare git)

Tengo una pequeña aplicación que gestiona varios repositorys git similares a Github / Gitorious. Github permite la edición de files en línea , y me gustaría saber si alguien tiene alguna idea sobre cómo lo gestionan.

Mi idea inicial fue que haría un clon completo del repository, use su presentación para replace el file, confirmar y enviar, pero esto parece una operación muy costosa con repositorys grandes como el kernel de Linux.

¿Alguna idea sobre una forma más eficiente de agregar y editar files en un repository simple?

Puede usar los commands de plomería.

Obtenga su HEAD actual, obtenga el tree de allí y luego sus blobs.

Una vez que tenga el blob puede poner el contenido en un textbox. Cuando haya terminado, solo tiene que crear el nuevo blob, crear el nuevo tree, el nuevo commit y tadaam. Está "empujado".

PD: Recuerde que se encuentra en un repository simple, por lo tanto, compruebe que cada command que utiliza no necesita el índice ni el directory de trabajo.


Como se ha pedido aquí, hay un ejemplo paso a paso.

Primero obtenemos el contenido actual del file:

> git cat-file -p HEAD:var/test/text.txt test 

Hacemos nuestra pequeña modificación en ese contenido y ahora tenemos un nuevo contenido listo para ser empujado. Para save ese contenido, lo haremos hash:

 > git hash-object -t blob -w var/test/text.txt 9764d221e6b50063b83c0268544c5d5b745ec9c5 

Esto lo saveá y devolverá un sha-1 de ese object (blob), el siguiente paso consiste en crear una nueva test carpeta que contendrá nuestro file text.txt . Pero primero veamos qué aspecto tiene la carpeta de test actual:

 > git ls-tree HEAD:var/test 100644 blob 9daeafb9864cf43055ae93beb0afd6c7d144bfa4 text.txt 

Entonces, lo que queremos hacer aquí, es replace el anterior SHA-1 ( 9daeafb... ) con el nuevo ( 9764d22... ) y generar un nuevo tree basado en eso (preste atención al \t ).

 > echo -e "100644 blob 9764d221e6b50063b83c0268544c5d5b745ec9c5\ttext.txt" | git mktree b7788f9e8e9a24be31188167a6a0bc1de9e41d24 

Genial, entonces ahora tenemos el nuevo file text.txt y la test carpeta principal, ahora necesitamos var .

 > git ls-tree HEAD:var 040000 tree 9bfb857f532d280ecd7704beb40a2ea4ba332f5a test > echo -e "040000 tree b7788f9e8e9a24be31188167a6a0bc1de9e41d24\ttest" | git mktree 536f33626a47138499fade7df6d02327f75d80be 

y ahora necesitamos el padre de var (que es la raíz de nuestro repository):

 > git ls-tree HEAD 040000 tree 31a6ee5e7d14a0569721632a05234185a109d6bd var > echo -e "040000 tree 536f33626a47138499fade7df6d02327f75d80be\tvar" | git mktree 7db3d6bc14cce98ff89ccc285b9d17965f5ca92b 

Y listo, nuestro tree está listo. Lo único que falta es la confirmación real:

 > git commit-tree -p HEAD -m "commit message" 7db3d6bc14cce98ff89ccc285b9d17965f5ca92b 4aa2de2cf9e3e4f5470bcd1ee1e83ef6e4025eaf 

Pero aún no está listo, ahora queremos que el compromiso sea la CABEZA, así que el último paso es:

 > git update-ref HEAD 4aa2de2cf9e3e4f5470bcd1ee1e83ef6e4025eaf 

Y ahora hemos terminado.


Recursos:

  • git hash-object
  • git cat-file
  • git ls-tree
  • git mk-tree