디렉토리와 그 내용을 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)을 사용하여 내용을 패키지하고 수신자가 압축을 풀 수 있도록 하는 것이 더 쉽습니다.

관련 정보