質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

Q&A

解決済

1回答

2278閲覧

patchで空ディレクトリ・ファイルの作成、ディレクトリ・ファイルの削除ができません。

mitsuru793

総合スコア157

bash

bash(Bourne-again-Shell)は sh(Bourne Shell)のインプリメンテーションに様々な機能が追加されたシェルです。LinuxやMac OS XではBashはデフォルトで導入されています。

0グッド

0クリップ

投稿2016/05/13 14:44

編集2016/05/13 14:44
diff -urN org_dir after_dir > dir.patch patch -p1 -d org_dir < dir.patch

上記のようにdiffpatchだと下記のことをやってくれません。

  1. 空ディレクトリの作成(.keepファイルを置くのは無効でした。中身が必要です。)
  2. 空ファイルの作成
  3. ディレクトリ・ファイルの削除

調べてみるとpatchは既存のファイルのみに有効なことがわかりました。patchのようなコマンドで上記3点が可能なものはありますでしょうか?用途は次のようなことを考えています。

railsなどのサンプルをいくつかgitで管理する際に、サンプルごとにリポジトリを作るのではなく、1つのリポジトリで全て管理します。この時に、サンプルのディレクトリをそのまま保存するのではなくパッチファイルにすれば、ファイル容量が小さく済むし、変更箇所が分かりやすいと思いました。パッチを当てる以外で何か良い案がありましたら教えて頂きたいです。

どうぞよろしくお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

期待されている回答とは異なると思いますが…

Gitで管理するのに「なぜ patch ??」という感じがします。結論を先に書けば、Gitでブランチ管理すれば良いだけなのではないでしょうか。

Gitで管理するということは、管理対象の各サンプルは「変更される」可能性があるという理解で合っていますか?
変更の可能性がないのであればわざわざGitで管理する必要性はなく、しかも「容量」を気にするのであればGitを利用することは目的に逆行すると思います。変更がないのであれば、ソース一式をZipか何かにアーカイブして保管しておけば良い訳で、変更管理のためのGitの仕組みは冗長以外の何者でもありません。

ところで、仮に2つのサンプルA、Bがあったとします。この場合、AとBを保管する代わりに、Aと「Aに対するBの差分(パッチ)」を保管した方が全体としての容量が削減されると共に、AとBの差分も一目で分かる、というのは事実です。

しかし、もしA、B共に誤記修正や改良のためにバージョンアップの可能性があるとすれば、途端にパッチによる管理は複雑になり、管理対象のサンプルが増えると「破綻」してしまうのではありませんか?
説明の都合上、「Aに対するBの差分(パッチ)」をP(A→B)と記載することにします。

A、Bがそれぞれ更新されて[A1、A2、A3…]、[B1、B2、B3…]となるところを、Bの代わりにパッチ[P1、P2、P3…]を管理するとします。その場合、P1〜P3はAのどのバージョンに対するB1〜B3のパッチなのでしょうか?

常にAの同じバージョンA1を基準にパッチを生成するのであれば、パッチP自体も差分管理する意味はあるかもしれませんが、そうするとパッチを見ただけでは最新のAとBの差分を把握することが出来ません。

一方、P1、P2、P3…の基準が変わってしまう(たとえば常にAの最新版に対してパッチを生成する)のであればP1とP2の差分には意味がなく、同じディレクトリツリーとして変更管理すると訳が分からなくなるため、パッチを生成する度に異なる名前(ディレクトリツリー)としてGitへコミットすることになり、管理が煩雑であると同時に容量の削減にもならなくなります。
というのは、B2を生成するためのパッチP2と一口に言っても、A1を基準にしているかA2を基準にしているかによって全く別物になる、つまりP2(A1→B2)とP2(A2→B2)は全く意味が異なるので、Aのどのバージョンを基準にしたパッチなのかを別途管理する必要性があるからです。(端的に言えば、都度、パッチの基準が分かるような異なる名前を考えて異なるディレクトリツリーとして管理する事になります。)

管理対象のサンプルの数が増えた場合、パッチを使った管理って現実的でしょうか?

一方、Git自体が、派生開発される複数のソースのバージョン管理を効率よく実施するためのツールなので、同一リポジトリ内の「ブランチ」として差分管理すれば目的が達成できると思いますが如何でしょうか?

(参考) 3.1 Git のブランチ機能 - ブランチとは

なお、Gitは本来、空のディレクトリを管理することはできないようですが、下記のような手法で管理可能なので、空ディレクトリの差分管理もできると思います。

git で空ディレクトリを管理(add)する方法

文章で書くと分かりにくいですが、ご参考になれば幸いです。

投稿2016/05/13 22:17

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mitsuru793

2016/05/15 22:23 編集

ご回答頂き、ありがとうございます。丁寧で具体的な説明をして頂いたので、とても参考になりました。 用途について補足させていただきます。 【用途】 現在はサンプルコードは実験するたびにディレクトリを作って下記のファイル構成にしています。 2016-05-15_read_is_function_for_asign_variables ├── README.md ├── 01_e_option.sh └── 02_expand.sh 試したコードなどはここに入れていって、README.mdにメモなどを残しています。そして、このディレクトリをjekyllのプロジェクト以下に入れてREADME.mdをHTMLで閲覧できるようにしています。 1つのディレクトリが1つの記事に対応しています。特定のディレクトリを渡すだけでも、サンプルを試したりREADMEを読むことが出来ます。 Railsで何か試した時に、作業の流れもわかるように下記の記事の用にcatでファイルを作成していく方法をとったりしてました。こうすることによって、編集する部分だけや流れを把握することができます。コードをREADME.mdに貼ればHTMLでも認できて便利です。 [Ruby on Rails チュートリアルの第1章、環境構築までをほぼ自動化するシェルスクリプト - Qiita](http://qiita.com/histori/items/ace1e5b224f5fd8f868b) ですが、このcatでファイルを作成する部分を作るのは面倒なのでpatchを使おうかなと考えましたが、上記の問題がありました。 【git】 管理をgitのブランチにすると、サンプルが増えるたびにブランチが増えてわかりずらくなってしまう気がしました。gitやブランチはあくまでjekyllの管理として使おうと思っております。 また、サンプルは一度書いたらバージョンアップして保守する予定はありません。新しいことを試すなら、また新規ディレクトリを作って実験していく予定です。 patchが無理の場合は、次の方法を考えていました。 * 差分のrailsプロジェクトのディレクトリを`cp -r`で上書きコピーする。 * そのままrailsプロジェクトを保存しておく。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問