ディレクトリとその内容をdiffパッチでパッケージ化しますか?

ディレクトリとその内容をdiffパッチでパッケージ化しますか?

フォーラムに質問できるように、どこかに投稿したいテキストファイルを含む小さなプロジェクトフォルダがあります。最も簡単なケースを考えてみましょう。次のようなものがあります。

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

明らかにサブフォルダ構造が欲しい。

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

...これを共有するときは少し疑問があります。だから最初に書いてみたいです。https://gist.github.com/各ファイルのサブディレクトリ名を入力してください。残念ながら、githubの応答は次のとおりです。

コンテンツファイルはサブディレクトリに配置したり、名前に「/」を含めることはできません。

...そして私はそこに登録しません。ちょうどチェックアウトしてサブディレクトリをgistにコミットしてこのようなことを行うことができるためですgit(誰かがopenIDを許可したいのですが…へ)。

だから私は何とかディレクトリ構造全体とファイルの内容をdiffパッチファイルとしてパッケージ化できると思いました。これにより、ファイルとしてGistに簡単にアップロードできます。しかし、私のフォルダと私が試した空のフォルダの違いを指定する方法がわかりません。

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

...しかし、明らかにこれはうまくいきません。

しかし、原則としては可能でなければなりません。テストケースは次のとおりです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

この時点で、0001-initial-commit.patch次の内容を含むファイルが表示されます。

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

…それが私が念頭に置いたものです。ただし、電子メールヘッダーと統計の説明を追加したくないので、パッチファイルからフォルダを再作成するようにgit求められません。これを使用してフォルダとその内容を再構築gitできます。patch

だから

  • バニラのみを使用してこれらのパッチファイルを作成することは可能ですかdiff
  • それ以外の場合は、すべてのgit関連のコメントを削除し、パッチが別々に作成されたかのgitように書式設定できますか?diff
  • 小さなバイナリファイル(spinner.gifなど)がある場合は、バイナリデータをbase64やポイントなどのパブリックサービスにパブリッシュ/貼り付けた後に保持される他のテキストエンコーディングとして含めるように指示diff(または)できますか?git

答え1

使用するには、diff次のものと比較する参照(空)ディレクトリが必要です。

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

を使用すると、目的のgit結果git diffを得ることができます。

バイナリファイルを処理するにはを使用します。これにより、何をすべきかがわかるgit diff --binaryエンコードパッチが生成されます。git apply

答え2

バニラのみを使用してこれらのパッチファイルを作成することは可能ですかdiff

GNU diff の場合、その-Nオプションが含まれていて、空のディレクトリを気にしない場合はそうです。

$ 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

それ以外の場合は、gitにすべてのgit関連のコメントを削除し、diffだけで生成されたようにパッチ形式を指定するように指示できますか?

git diff最初に空のコミットがある場合は、次のものを使用できます。

$ 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

答え3

ファイルとディレクトリをテキストとして転送する(やや)標準的な方法はshar(1)を使用することです。これにより、ファイル/ディレクトリを再生成するための(やや読みやすい)シェルスクリプトが生成されます。

tar(1) または zip(1) を使用してコンテンツをパッケージ化し、受信者が解凍できるようにする方が簡単です。

関連情報