我有一个包含文本文件的小项目文件夹,我想将其张贴在某处以便在论坛上提问。在最简单的情况下,让我们假设我有这样的事情:
mkdir aaa
cd aaa
echo AAA > aaa.txt
mkdir bbb
echo BBB > bbb/bbb.txt
Run Code Online (Sandbox Code Playgroud)
显然,我想要子文件夹结构:
aaa/
??? aaa.txt
??? bbb
??? bbb.txt
Run Code Online (Sandbox Code Playgroud)
......当我分享这个时会被保留下来。所以我想首先使用https://gist.github.com/并为每个文件输入子目录名称;不幸的是 github 回应:
内容文件不能在子目录中或在名称中包含“/”
...而且我不打算在那里注册,只是为了能够通过 检出子目录并将子目录提交到要点git
,对于这样的事情(人们希望他们接受 openID,但是......呃)。
所以,我想,也许我可以以某种方式将整个目录结构和文件内容打包为一个diff
补丁文件;那么作为单个文件,应该很容易上传到一个要点。但是,我不知道如何指定我的文件夹和空文件夹之间的差异;我试过:
$ diff -Naur /dev/null /tmp/aaa
diff: /tmp/aaa/null: No such file or directory
Run Code Online (Sandbox Code Playgroud)
......但显然,这行不通。
但是,原则上应该是可能的 - 这是一个测试用例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
Run Code Online (Sandbox Code Playgroud)
此时,会0001-initial-commit.patch
出现一个文件,其中包含以下内容:
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
Run Code Online (Sandbox Code Playgroud)
...这大约是我的想法,除了 - 我不想要任何git
添加的电子邮件标题和统计评论;而且我不想git
被要求从补丁文件重建文件夹 - 我只是希望人们能够使用它patch
来重建文件夹及其内容。
所以
diff
?git
删除所有特定于 git 的注释,并像diff
单独生成补丁一样格式化补丁?diff
(或git
)将二进制数据包含为 base64,或其他文本编码可以在发布/粘贴到公共服务(如 gist)时幸存下来?仅使用diff
,您需要一个参考(空)目录来比较事物:
mkdir /tmp/scratch
diff -urN /tmp/scratch /tmp/aaa
Run Code Online (Sandbox Code Playgroud)
使用git
,git diff
应该给你你正在寻找的输出。
要处理二进制文件,请使用git diff --binary
; 这将产生一个编码的补丁,git apply
它将知道如何处理。