¿Empaqueta un directory y su contenido como un parche diff?

Tengo una pequeña carpeta de proyecto con files de text, que me gustaría publicar en alguna parte para poder hacer una pregunta en un foro. Tomemos, en el caso más simple, que tengo algo como esto:

mkdir aaa cd aaa echo AAA > aaa.txt mkdir bbb echo BBB > bbb/bbb.txt 

Obviamente, me gustaría la estructura de la subcarpeta:

 aaa/ ├── aaa.txt └── bbb └── bbb.txt 

… para ser preservado cuando comparto esto. Así que pensé primero usar https://gist.github.com/ e ingresar nombres de subdirectory para cada file; lamentablemente github responde con:

Los files de contenido no pueden estar en subdirectorys ni include '/' en el nombre

… y no tengo la intención de registrarme allí, solo para poder verificar y asignar subdirectorys a la esencia a través de git , para algo como esto (uno desearía que aceptaran openID, pero … eh).

Entonces, pensé, tal vez de alguna manera puedo empaquetar toda la estructura de directorys y el contenido del file como un file de parche diff ; luego, como un solo file, debería ser fácil uploadlo a un elemento esencial. Sin embargo, no sé cómo especificar una diferencia entre mi carpeta y una carpeta vacía; Lo intenté:

 $ diff -Naur /dev/null /tmp/aaa diff: /tmp/aaa/null: No such file or directory 

… pero claramente, eso no funciona.

Sin embargo, en principio debería ser posible, aquí hay un caso de testing a través de git :

 mkdir aaa cd aaa git init git config user.name test git config user.email test@test.com echo AAA > aaa.txt mkdir bbb echo BBB > bbb/bbb.txt git add . git commit -m 'initial commit' git format-patch -1 HEAD 

En este punto, aparece un file 0001-initial-commit.patch , con estos contenidos:

 From 5834ae98fad9a9148648577f366af3498be6d364 Mon Sep 17 00:00:00 2001 From: test <test@test.com> Date: Wed, 16 Dec 2015 10:25:23 +0100 Subject: [PATCH] initial commit --- aaa.txt | 1 + bbb/bbb.txt | 1 + 2 files changed, 2 insertions(+) create mode 100644 aaa.txt create mode 100644 bbb/bbb.txt diff --git a/aaa.txt b/aaa.txt new file mode 100644 index 0000000..43d5a8e --- /dev/null +++ b/aaa.txt @@ -0,0 +1 @@ +AAA diff --git a/bbb/bbb.txt b/bbb/bbb.txt new file mode 100644 index 0000000..ba62923 --- /dev/null +++ b/bbb/bbb.txt @@ -0,0 +1 @@ +BBB -- 1.9.1 

… que es aproximadamente lo que tenía en mente, excepto que no quiero ninguno de los encabezados de correo electrónico y comentarios estadísticos que git agrega; y tampoco me gustaría que se requiera a git para rebuild la carpeta desde el file de parche; solo me gustaría que las personas puedan usar el patch para rebuild la carpeta y su contenido.

Asi que

  • ¿Es posible hacer un file de parche como este usando solo diff vainilla?
  • Si no es así, ¿es posible decirle a git que elimine todos los comentarios específicos de git, y formatee un parche como si hubiera sido producido solo por diff ?
  • En caso de que haya pequeños files binarys allí (es decir, spinner.gif y demás), es posible indicar a diff (o git ) que incluya los datos binarys como base64 u otra encoding de text que pueda sobrevivir a publicar / pegar a un service público como ¿esencia?

Usando solo diff , necesita un directory de reference (vacío) para comparar cosas con:

 mkdir /tmp/scratch diff -urN /tmp/scratch /tmp/aaa 

Usando git , git diff debería darle la salida que está buscando.

Para manejar binarys, use git diff --binary ; esto producirá un parche codificado que git apply sabrá cómo manejar.

¿Es posible hacer un file de parche como este usando solo diff vainilla?

Con GNU diff, sí, si incluye la opción -N y no le importan los directorys vacíos:

 $ tree ab a ├── aaa │  ├── aaa.txt │  └── bbb │  └── bbb.txt └── ccc b 3 directories, 2 files $ diff -uNr ba | (cd b; patch -p1) ~/devel/b patching file aaa/aaa.txt patching file aaa/bbb/bbb.txt $ tree b b └── aaa ├── aaa.txt └── bbb └── bbb.txt 2 directories, 2 files 

Si no es así, ¿es posible decirle a git que elimine todos los comentarios específicos de git, y formatee un parche como si hubiera sido producido solo por diff?

git diff se puede usar si hubo una confirmación inicial vacía:

 $ git init $ git commit --allow-empty -m init [empty (root-commit) d1d0a97] init $ git add aaa $ git commit -m 'foo' [empty b834eba] foo 2 files changed, 2 insertions(+) create mode 100644 aaa/aaa.txt create mode 100644 aaa/bbb/bbb.txt $ git diff 'HEAD^' diff --git a/aaa/aaa.txt b/aaa/aaa.txt new file mode 100644 index 0000000..43d5a8e --- /dev/null +++ b/aaa/aaa.txt @@ -0,0 +1 @@ +AAA diff --git a/aaa/bbb/bbb.txt b/aaa/bbb/bbb.txt new file mode 100644 index 0000000..ba62923 --- /dev/null +++ b/aaa/bbb/bbb.txt @@ -0,0 +1 @@ +BBB