Git管理下のファイルの差分をpatchコマンドで適応するまとめ

たまに使うのですが、その度に調べたりしているのでまとめておきました。

確認version

  • Git 2.23.0

patchファイルを作成する

git diff

git diffの場合はシンプルです。今変更しているファイルの差分を出力するだけです。

$ git diff > file.patch
git log

git logの場合はそのままだと、リポジトリ全てのログが表示されてしまうのでリビジョン指定やファイル指定を行うことがほとんどです。

よく使うのは特定ファイルの直近コミットの差分、特定ファイルの指定コミットの差分ですね。

# fileの直近コミットの差分
$ git log -u -1 file > file.patch

# fileの指定コミットの差分
$ git log -u -1 {コミットのhash値} file > file.patch
no-prefixオプション

git diffやgit logはルートディレクトリからの相対パスにprefixをつけた状態でファイルパスを表示します。

--- a/file
+++ b/file

これが、patchコマンドで適応するときどう影響してくるかは後述しますがno-prefixオプションをつけるとこのprefixを無くすことができます。

--no-prefix
    Do not show any source or destination prefix.

実際にno-prefixオプションをつけてみると下記のように出力されます。

--- file
+++ file

patchファイルを適応する

patchファイルの適応にはpatchコマンドを使用します。

$ patch < file.patch

このコマンドを実行するパスが非常に大事になってきます。
git diffによって出力されたファイルパスをpatchコマンドを実行したパスを起点にファイルを探します。

この挙動をpオプションで制御することができます。

pオプション
-pnum  or  --strip=num
    Strip the smallest prefix containing num leading slashes from each file name found in the patch file.  A sequence of one or more adjacent slashes is counted as  a  single
    slash.   This  controls  how  file names found in the patch file are treated, in case you keep your files in a different directory than the person who sent out the patch.
    For example, supposing the file name in the patch file was

       /u/howard/src/blurfl/blurfl.c

    setting -p0 gives the entire file name unmodified, -p1 gives

       u/howard/src/blurfl/blurfl.c

    without the leading slash, -p4 gives

       blurfl/blurfl.c

    and not specifying -p at all just gives you blurfl.c.  Whatever you end up with is looked for either in the current directory,  or  the  directory  specified  by  the  -d
    option.

ヘルプに記載されている通りですが要約すると下記のようになるかと思います。

  • オプションが指定されていない場合はファイル名のみ
  • 0を指定するとルートディレクトリからの相対パス
  • 0以外の数字を指定すると、指定した数分のスラッシュまでを削る

なので、ルートディレクトリでpatchコマンドを実行する際は-p0をつけるとよいのですが、
先述のno-prefixオプションを使っていない場合には実際のパスには存在しないa/,b/が付与されているので-p0を使いたい場合にはno-prefixをつけようということです。
no-prefixをつけない場合には-p1をつけてa/,b/を無視すればよいので、要はどっちで考慮するかということです。

# ルートディレクトリでno-prefixをつけて出力
$ git diff --no-prefix > file.patch # patch出力
$ git checkout . # 変更を元に戻す
$ patch -p0 < file.patch # 変更を適応する

# ルートディレクトリでno-prefixをつけないで出力
$ git diff > file.patch # patch出力
$ git checkout . # 変更を元に戻す
$ patch -p1 < file.patch # 変更を適応する

たとえ、間違えてもpatchコマンドはファイルが見つからないときに、下記プロンプトが出てカレントディレクトリからのパスを記載すれば適応してくれます。

File to patch: 

適応した変更を元に戻す

patchコマンドのRオプションを使えばできます。

$ patch -R < file.patch

Gitで管理されているファイルでこんなことをやっても、なんも面白くないですが
例えばサーバ上はGit管理されていなくて、同じディレクトリ構成のローカル環境がGitで管理されている場合などに
patchファイル作成して適応すれば便利かもしれません。

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

わかばちゃんと学ぶ Git使い方入門〈GitHub、Bitbucket、SourceTree〉

DockerHubのRuby Alpineで作るheadless chrome環境

headless chromeとSelenium WebDriverを使いたいと思ったときすぐ使えるような環境を作る。
Debian環境よりも簡単にインストールすることができたのでAlpine Linuxを使う。

Dockerfile

FROM ruby:2.6.4-alpine3.10

RUN apk add -U chromium chromium-chromedriver

これだけでOK。あとはgemをインストールしてオプションを渡して上げればすぐ使える。
Alpine Linuxのパッケージマネージャapkについてはこちらも要チェック

require 'selenium-webdriver'                                                                                                                                                                            

options = Selenium::WebDriver::Chrome::Options.new
options.add_argument("--no-sandbox")
options.add_argument("--headless")

session = Selenium::WebDriver.for :chrome, options: options

スクリーンショットなど、日本語フォントが必要になった際はGoogle Noto Fontsをインストールすると良い。

Dockerfileに追記

RUN mkdir /noto
ADD https://noto-website.storage.googleapis.com/pkgs/NotoSansCJKjp-hinted.zip /noto
WORKDIR /noto
RUN unzip NotoSansCJKjp-hinted.zip && \
    mkdir -p /usr/share/fonts/noto && \
    cp *.otf /usr/share/fonts/noto && \
    chmod 644 -R /usr/share/fonts/noto/ && \
    fc-cache -fv

参考リンク

コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤

コンテナ・ベース・オーケストレーション Docker/Kubernetesで作るクラウド時代のシステム基盤

  • 作者: 橋本直哉,須江信洋,前佛雅人,境川章一郎,佐藤聖規,山田修司,青山尚暉,市川豊,平岡大祐,福田潔,矢野哲朗
  • 出版社/メーカー: 翔泳社
  • 発売日: 2018/03/12
  • メディア: Kindle版
  • この商品を含むブログを見る

Docker ComposeでRailsのアプリケーションログをFluentdでElasticsearchに送信する

過去の記事

前々回

前回


実現したいこと

Nginxと同じようにRailsのアプリケーションログもKibanaで参照できるようにしたい。
引き続き、過去の記事で使用した環境に変更を加えていくのでdiffを記載していく。

Rails

参考

基本的には参考サイトの通りやれば実現可能。
ただ、act-fluent-logger-railsに関してリリースされている最新の0.5.0ではRails6に対応していない。
Githubを確認したところmasterブランチには修正が適応されていたのでGemfileでGithubを指定すれば可能。

Gemfile
--- a/Gemfile
+++ b/Gemfile
@@ -47,3 +47,6 @@ end

 # Windows does not include zoneinfo files, so bundle the tzinfo-data gem
 gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
+
+gem 'act-fluent-logger-rails', git: 'https://github.com/actindi/act-fluent-logger-rails.git'
+gem 'lograge'

Gemfileを更新したのでdocker-compose build webを行っておく。

config/application.rb
--- a/config/application.rb
+++ b/config/application.rb
@@ -15,5 +15,9 @@ module Myapp
     # Application configuration can go into files in config/initializers
     # -- all .rb files in that directory are automatically loaded after loading
     # the framework and any gems in your application.
+    config.log_level = :info
+    config.logger = ActFluentLoggerRails::Logger.new
+    config.lograge.enabled = true
+    config.lograge.formatter = Lograge::Formatters::Json.new
   end
 end
config/fluent-logger.yml

ファイルを新規に作成。ひとまずdevelopmentのhostのみ設定しておく。

development:
  fluent_host:   fluentd
  fluent_port:   24224
  tag:           'rails'
  messages_type: 'string'

test:
  fluent_host:   '127.0.0.1'
  fluent_port:   24224
  tag:           'rails'
  messages_type: 'string'

production:
  fluent_host:   '127.0.0.1'
  fluent_port:   24224
  tag:           'rails'
  messages_type: 'string'

Fluentd

fluent.conf

ひとまず、Nginxの設定をほぼコピペで設定。

--- a/fluentd/fluent.conf
+++ b/fluentd/fluent.conf
@@ -14,3 +14,13 @@
   logstash_format true
   logstash_prefix nginx.access
 </match>
+
+<match rails>
+  @type elasticsearch
+  host elasticsearch
+  buffer_type memory
+  port 9200
+  type_name rails
+  logstash_format true
+  logstash_prefix rails.access
+</match>

この状態で、localhostにアクセスをしてKibanaでCreate index patternをするとrailsのログがきているはず。
f:id:arcright:20190930232653p:plain

みんなのDocker/Kubernetes

みんなのDocker/Kubernetes

  • 作者: 石澤基,五十嵐綾,大塚元央,須田一輝,稲津和磨,九岡佑介,坂部広大,青山真也,池添明宏,上岡真也
  • 出版社/メーカー: 技術評論社
  • 発売日: 2019/04/18
  • メディア: 単行本(ソフトカバー)
  • この商品を含むブログを見る