フォーラムに質問できるように、どこかに投稿したいテキストファイルを含む小さなプロジェクトフォルダがあります。最も簡単なケースを考えてみましょう。次のようなものがあります。
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) を使用してコンテンツをパッケージ化し、受信者が解凍できるようにする方が簡単です。