2011-07-27 6 views
7

Tengo una pequeña aplicación que administra varios repositorios git similares a Github/Gitorious. Github permite inline file editing, y me gustaría saber si alguien tiene alguna idea sobre cómo lo hacen.¿Cómo permite Github la edición de archivos en línea? (O cómo agregar o editar archivos en un repositorio de git vacío)

Mi idea inicial fue que haría un clon completo del repositorio, utilice su presentación para reemplazar el archivo, confirmar y enviar, pero esto parece una operación muy costosa con repositorios grandes como el kernel de Linux.

¿Alguna idea sobre una manera más eficiente de agregar y editar archivos en un repositorio simple?

Respuesta

8

Puede usar los comandos de fontanería.

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

Una vez que tenga el blob puede colocar el contenido en un cuadro de texto. Cuando haya terminado, solo tiene que crear el nuevo blob, crear el nuevo árbol, el nuevo commit y tadaam. Está "empujado".

PD: Recuerde que se encuentra en un repositorio vacío, por lo tanto, compruebe que cada comando que utiliza no necesita el índice ni el directorio de trabajo.


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

En primer lugar, obtener el contenido del archivo actual:

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

Hacemos nuestro pequeña modificación en la que el contenido y ahora tienen un nuevo contenido listo para ser empujado. Para guardar el contenido que vamos a hash:

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

Esto lo guardará, y devolver un SHA-1 de dicho objeto (BLOB), el siguiente paso consiste en crear una nueva carpeta, que test contendrá nuestro archivo text.txt. Pero primero vamos a ver lo que se ve el actual test carpeta como:

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

Así que lo que queremos hacer aquí, es reemplazar la anterior SHA-1 (9daeafb...) con la nueva (9764d22...) y generar un nuevo árbol basado en eso (preste atención al \t).

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

Grande, así que ahora tenemos el nuevo archivo text.txt y la carpeta principal test, ahora tenemos var.

> git ls-tree HEAD:var 
040000 tree 9bfb857f532d280ecd7704beb40a2ea4ba332f5a test 

> echo -e "040000 tree b7788f9e8e9a24be31188167a6a0bc1de9e41d24\ttest" | git mktree 
536f33626a47138499fade7df6d02327f75d80be 

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

> git ls-tree HEAD 
040000 tree 31a6ee5e7d14a0569721632a05234185a109d6bd var 

> echo -e "040000 tree 536f33626a47138499fade7df6d02327f75d80be\tvar" | git mktree 
7db3d6bc14cce98ff89ccc285b9d17965f5ca92b 

y listo, nuestro árbol está listo.Lo único que falta es el real se comprometen:

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

Pero aún no está listo, ahora queremos que el comprometen a ser la cabeza, por lo que el último paso es:

> git update-ref HEAD 4aa2de2cf9e3e4f5470bcd1ee1e83ef6e4025eaf 

Y ahora hemos terminado.


Recursos:

+1

Gracias ¡mucho! La palabra clave que ayudó fue git 'fontanería'. –

+0

¿podría hacer un pequeño ejemplo de cómo agregar algún archivo (como /var/test/text.txt)? o sobrescribir el mismo? – NaN

+0

Actualicé con un ejemplo completo, espero que ayude. –

Cuestiones relacionadas