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

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

ただいまの
回答率

90.47%

  • bash

    671questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 750

mitsuru793

score 149

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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/16 07:22 編集

    ご回答頂き、ありがとうございます。丁寧で具体的な説明をして頂いたので、とても参考になりました。

    用途について補足させていただきます。
    【用途】
    現在はサンプルコードは実験するたびにディレクトリを作って下記のファイル構成にしています。

    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プロジェクトを保存しておく。

    キャンセル

関連した質問

同じタグがついた質問を見る

  • bash

    671questions

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