Mac
Windows
GitHub
hub

Windowsで作ったProjectをMacでhub amしたら失敗する話

More than 1 year has passed since last update.

改行コードが違うのが原因

バージョン

$ hub --version
git version 2.4.5
hub version 2.2.1

経緯

  1. GitHubにRepository作る
  2. Windows(=改行コード「CR+LF」)でファイルを作って、GitHubにpushしてる
  3. ↑↓開発チームが移管
  4. 改修を行い、pull requestを作る
  5. GitHubのWebページで「Merge pull request」する(ここまでは成功する)
  6. リリースが決定する
  7. Macで、リリース用ブランチにてhub amする

    $ hub am <pull requst>
    
  8. patchの適用に失敗する

    error: patch failed: 
    
  9. 悲しい気持ちになる

解決法1:dos2unixコマンドを使う

解決法1は、commit後に「git log -p -2」すると、
ファイルの全行が更新されたことになってしまう。
そのかわし、一度やれば、以降は
該当ファイルは普通にhub amできるようになる。

  1. 更新したいファイルの改行コードを変更する

    $ dos2unix <ファイルパス>
    
  2. patchを手動適用

    $ patch -p1 < .git/rebase-apply/patch
    
  3. rejファイルがないことを確認

    $ find . -name "*\.rej" | wc -l
    
  4. patchの適用に成功したら、git add & git am & git push

    $ find . -name "*\.orig" | xargs rm
    $ git add .
    $ git am --continue
    $ git push origin <リリース用ブランチ>
    

    最初の「find . -name "*¥.orig" | xargs rm」は、
    patchファイルに空白のみの行があった時などに
    origファイルが作成されてしまうため、削除しておく。
    ※本当は、出ないようにpull requestを作成するのが正解

解決法2:patchコマンドに--binaryオプションをつける(未検証)

解決法2は、更新したい箇所だけを更新できるから、
リリース用ブランチのチェックは正確にできそう。

  1. patchを手動適用

    patch --binary -p1 < .git/rebase-apply/patch
    
  2. patchの適用に成功したら、git add & git am & git push

    $ git add <更新したファイル>
    $ git am --continue
    $ git push origin <リリース用ブランチ>
    

解決法3:Windowsでマージする

※前準備
git for windowsをインストール
https://git-for-windows.github.io/

  1. ブラウザで以下のURLにアクセスし、patchファイルをローカルに保存

    http://github.com/・・・/・・・/pull/1.patch
    
  2. Git BASHを起動し、プロジェクトに移動

    $ cd プロジェクトパス
    $ git checkout <リリース用ブランチ>
    
  3. git amを実行

    $ git am patchファイル置き場/1.patch
    
  4. 失敗するので、patchを手動適用

    patch --binary -p1 < .git/rebase-apply/patch
    
  5. patchの適用に成功したら、改行コードがLinux(LF)になってしまう為、エディター等を使い、改行コードを戻す

  6. git add & git am & git push

    $ git add <更新したファイル>
    $ git am --continue
    $ git push origin <リリース用ブランチ>