Empacotando um diretório e seu conteúdo como um patch diff?

3

Eu tenho uma pequena pasta de projeto com arquivos de texto, que gostaria de postar em algum lugar para fazer uma pergunta em um fórum. Vamos considerar, no caso mais simples, que eu tenha algo assim:

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

Obviamente, gostaria da estrutura da subpasta:

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

... para ser preservado quando eu compartilhar isso. Então eu pensei primeiro em usar o link e digitar os nomes dos subdiretórios para cada arquivo; infelizmente o github responde com:

Contents files can't be in subdirectories or include '/' in the name

... e não pretendo me registrar lá, apenas para poder fazer check-out e commitar subdiretórios para o gist via git , para algo assim (alguém gostaria que eles aceitassem o openID, mas ... eh).

Então, eu pensei, talvez eu possa de alguma forma empacotar toda a estrutura de diretório e o conteúdo do arquivo como um arquivo de correção diff ; então, como um arquivo único, deve ser fácil fazer o upload para uma essência. No entanto, não sei como especificar um diff entre minha pasta e uma pasta vazia; Eu tentei:

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

... mas claramente, isso não funciona.

No entanto, em princípio, isso deve ser possível - aqui está um caso de teste via git :

mkdir aaa
cd aaa
git init
git config user.name test
git config user.email [email protected]

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

git add .
git commit -m 'initial commit'
git format-patch -1 HEAD

Neste ponto, um arquivo 0001-initial-commit.patch aparece, com estes conteúdos:

From 5834ae98fad9a9148648577f366af3498be6d364 Mon Sep 17 00:00:00 2001
From: test <[email protected]>
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 é aproximadamente o que eu tinha em mente, exceto - eu não quero nenhum dos cabeçalhos de e-mail e comentários de estatísticas que git adiciona; e também não quero que git seja obrigado a reconstruir a pasta a partir do arquivo de patch - eu gostaria que as pessoas pudessem usar patch para reconstruir a pasta e seu conteúdo.

Então

  • É possível fazer um arquivo de correção como este usando apenas baunilha diff ?
  • Se não, é possível dizer a git para remover todos os comentários específicos do git e formatar um patch como se fosse produzido por diff sozinho?
  • Caso haja arquivos binários pequenos (isto é, spinner.gif e outros), é possível instruir diff (ou git ) a incluir os dados binários como base64 ou outra codificação de texto que sobreviveria a postagens / colando para um serviço público como essência?
por sdaau 16.12.2015 / 10:59

2 respostas

6

Usando apenas diff , você precisa de um diretório de referência (vazio) para comparar as coisas com:

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

Usar git , git diff deve fornecer a saída que você está procurando.

Para manipular binários, use git diff --binary ; isso produzirá um patch codificado que git apply saberá como manipular.

    
por 16.12.2015 / 11:10
4

Is it possible to do a patch file like this using only vanilla diff?

Com o GNU diff, sim, se você incluir a opção -N e não se importar com diretórios vazios:

$ tree a b
a
├── aaa
│   ├── aaa.txt
│   └── bbb
│       └── bbb.txt
└── ccc
b

3 directories, 2 files
$ diff -uNr b a | (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

If not, is it possible to tell git to remove all git-specific comments, and format a patch as if it was produced by diff alone?

git diff pode ser usado se houver um commit vazio inicial:

$ 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
    
por 16.12.2015 / 11:14

Tags