from electron 2 web

インターネットのリソースを無駄遣いして検索におけるUXを下げてごめんなさい

圧倒的文章力のNASAでゴミみたいなチラ裏のようなメモを量産してしまい全ての"Web開発者"にごめんなさい

gitでパッチを適用したい

f:id:lv7777:20160304222827p:plain

patchについて

まずは敵を知るべし。

patch - Wikipedia

Windows Vista 以後はプログラム名に「patch」という単語が含まれていると UAC によってマルウェアと判断されるので、UAC に対応したものを利用する必要がある。

えぇ・・・(虐おじ

ちなみにwin10では再現しなかったgit側が対応してくれてるっぽい。ありがとナス!

  • unified diff

    一般的らしい diffコマンド -uオプション

    @@ -元ファイル +変更後のファイル @@という行情報が先頭にある。

    行の先頭:+,-,スペース

  • context diff

    diff command -c option

    ***は変更前の行情報

    ---は変更後の行情報

    行の先頭:!が変更、+が新規追加、スペースが変更なし。

コマンド

下記の5つがパッチに関係するコマンド

  • diff

    linux標準コマンド。差分を作る。

    出力形式多い。

      [http://webkaru.net/linux/command-diff/:embed:cite]
    
  • git format-patch

    mbox形式のパッチを作る。パッチ作るならこれが一番安全。

    • その地点から現在まで

      git format-patch HEAD~~

    • 範囲指定

      git format-patch HRAD~~..HEAD~

      間に..をつける

    このabove2つはsha1でも可

  • git diff

    おなじみ比較コマンドだがstdoutからファイルにリダイレクトを掛けることでパッチ生成コマンドにできる。

    ただ成功しなかった。

    パッチ作る時はformat-patchが安全か(gitのパッチ自体そもそも成功率低いが)

    git diffで作ったパッチはlinuxのパッチコマンドで充てる

  • git apply

    パッチを適用する。ファイルの作成は出来ない。一応mbox形式のパッチも当てることは出来るがめんどくさい。

    全て適用 OR 何も適用しないの2通りしか無い(一貫性。RASISのI、ACIDのA)

    ファイルの生成は出来ない。そういうのをする時はamコマンドを使う

  • git am

    パッチを適用する2つ目のコマンド。コッチのが複雑。状態も持つ。

    もしコンフリクトが発生した場合そこで一旦jobは終わる(cmdならまたc:XXX>の状態に戻る)

    • --continue

      コンフリクト直後の状態でストップした状態から進める。

    • --abort

      コンフリクトで宙に浮いた状態の不安定なリポジトリをパッチを当てようとした直前の状態に戻す。

    • --resolve

      コンフリクトが解決したことをgitに知らせる。(コンフリクトが発生してから終わりまで自力で当てたとか)

  • git rebase

    普段はmargeと対をなすcommitを統合する存在(pullの使い方もある)だが
    patchでも使用することもあるらしいがよくわからない。

  • patch

    パッチを当てるときに使う。
    linuxコマンド。俺はwin使いだけどcygwin入れてるので使える。

    patch [ファイル名(option)] < path/to/patchfail.patch

    • -u,-c

      diffが出力したpatch formatを選べる。

    • -R

      リバースパッチ。逆に更新を取り外すみたいな?

diffとpatchでパッチを当ててみる

git関係ないしwindowsだしいろいろアレ。

diff -u a.txt b.txt > p.patch

patch -u a.txt < p.patch

簡単。流石linux

ディレクトリごとの比較

diff -crN folder folder2 > dir.patch

patch -crN -d folder2 <dir.patch

できるかなと思ってやってみた。出来た。神。

-dオプションがいるとこで躓いた。あと"新しい ファイル.txt"みたいにスペースがあるとそこで切れる。

ただし空ファイルは扱いないっぽい。この点がなければ完璧だった。

git am時のエラー

俺の場合はそもそも同じリポジトリを使わなきゃいけないことを知らなくて新しくgit initしてたのでこの場合はgit amだと絶対に無理。format-patchの開始コミットとpatchを当てられるリポジトリが同じコミットにいなきゃいけないっぽい。

それ以外の場合はdiff,patch使えば行けるかも。

  • does not match index

    コイツが大元。

stackoverflow.com

  • sha1 information is lacking or useless

    patch -3の三入力オプション使ったらこんなエラーが出た気がする。

stackoverflow.com

  • rebase-apply still exists but mbox given.

    git am形式でコンフリクトか何かが発生してジョブが中断された状態なのに新規で始めようとした。みたいな感じ。

    ↓のなかで解決策は.git/rebase-XXXXを消せばいいって書いてあるけどそもそもそれ以前でエラーが発生したので俺の場合は大元を解決しないといけない。

stackoverflow.com

    この状態で.git/rebase-XXXXを消してもステージング(git add .)された状態なのでアンステージしてさらに変更を取り消さなければいけない。

    俺はvscode使ってたので楽に出来たけど~~生でやってる人大変かも。~~(git reset \-\-hardか)

余談

初めてvimのmd装備で書いた(previmopen

便利だし神

あと今までopen-browser.vim使ってなかった。。。

previmはmermaidとかいうグラフ書くmarkdown拡張に対応してるらしい。

graph TD;
    A-->B;
    A-->C;
    B-->D;
    C-->E;

感想

linuxのpatchが有能すぎる。もうこいつだけでいいんじゃね?

ていうかそもそもなんでパッチ当てようかって思ったかっていうと
github-commiterが最初firefoxブランチ(現在githubに上がってる奴)で開発してたんだけどなんかバグってファイルだけ新しくディレクトリにコピって
firefoxブランチとchromeブランチを分けてあまりにもchromeブランチが進んでて
一旦firefoxブランチにあった機能をchromeブランチにmargeしようとしたらエラーが出たから
chromeブランチだけで進めて一応beta版リリースまで行ったからfirefoxブランチをそこまで持っていくのにディレクトリコピった時点でレポジトリ分かれてるからmarge出来なくて手で直すかって頑張ろうとしたんだけど流石に500行位あるファイル*4を手打ちで進めるとか無理があるのに気づいてpatch使おうかってなったわけ。

なんか長すぎて文もバグってるな。まあ大変だったってこと。

あと個人的にはエラーについて書くつもりだったけどエラーのとき焦っててぜんぜんメモってなかったから書くことがなくなってしまった。webにもほとんど日本語の情報ないし。あの超有名なgitなのに。

次ハマった人の参考になれば幸いです。

宣伝

github commiterβ版リリースしました。

概要:

よっし!ブラウザのエディタでブログ書いたぞ!ー>うわあああwwwwクラッシュだあああwwwwバックアップ取ってないwwww死んだwwww

となってしまったあなたに

_人人人人人人人人人人人人人_
>  Github commiter    <
 ̄YYYYYYYYYYYY

使い方:

1.インストールしたらアイコンをクリックしてgithubのユーザー情報を入れます。(盗聴などはしてないので安心して下さい!)

2.どのサイトで有効化(例:http?://developer.mozilla.jp)、webページのどの部分を保存するか(はてなブログだったら記事編集部分)、ファイル名(url、またはwebページの要素から取得)、拡張機能がいつ有効化(githubに送られてくるか)を入力し、保存ボタンを押します。

3.入力したページに行き、なおかつ有効化を設定したイベントが開始されると自動的にバックアップが開始されます!

4.これでもう安心。ブログも翻訳も入力が消えることはありません!