hack のためのネタ帳, etc,,,

発端

以下のような素晴らしい tweet を見かけた。

ところが、 で公開されている .ipynb を見ると、なぜか改行の入ってないフォーマットになっていた。
このため、commit の差分表示した際 ipynb の差分がファイル全体となり局所的な変更点を追跡出来ない状態だった。

.ipynb を差分追跡可能にする

これは単純に Cygwin 上に導入した Jupyter Notebook で .ipynb を開いてそのまま上書き保存すれば改行の入った形式になり差分追跡可能になった。

元の .ipynb がなぜ改行のないフォーマットで保存されているのかは原因不明。
  • Google Colaboratory から直接保存したから?
  • Jupyter Notebook のバージョン違い?
他に何か原因となりそうな理由はあるだろうか?

とりあえず、うちの Cygwin 上の Jupyter Notebook のバージョンは以下の状態だった。
$ pip3 list|grep -i jupyter
jupyter                           1.0.0
jupyter-client                    5.3.1
jupyter-console                   6.0.0
jupyter-contrib-core              0.3.3
jupyter-contrib-nbextensions      0.5.1
jupyter-core                      4.5.0
jupyter-highlight-selected-word   0.2.0
jupyter-latex-envs                1.4.6
jupyter-nbextensions-configurator 0.4.1

リポジトリの再構築

以下の2つのスクリプトをこさえた

recommit.sh

#!/usr/bin/env bash

COMMIT="$(cat commit)"
AUTHOR_DATE="$(git log "$COMMIT" -1 --pretty=format:%ai)"
AUTHOR="$(git log "$COMMIT" -1 --pretty=format:"%an <%ae>")"
COMMITTER_NAME="$(git log "$COMMIT" -1 --pretty=format:"%cn")"
COMMITTER_EMAIL="$(git log "$COMMIT" -1 --pretty=format:"%ce")"
COMMITTER_DATE="$(git log "$COMMIT" -1 --pretty=format:"%ci")"
MSG="$(git log "$COMMIT" -1 --pretty=format:"%B")"

GIT_COMMITTER_NAME="$COMMITTER_NAME" \
GIT_COMMITTER_EMAIL="$COMMITTER_EMAIL" \
GIT_COMMITTER_DATE="$COMMITTER_DATE" \
git commit --date "$AUTHOR_DATE" --author "$AUTHOR" -m "$MSG" "$@"

cat reset.sh

#!/usr/bin/env bash

HEAD="$(git log -1 --pretty=format:%H)"
git reset --hard "$1"
git reset "$HEAD"
echo "$1" >commit

まず、
git clone https://github.com/dbkk/docx-researchmap
cd docx-researchmap
git checkout -b diff-traceable-ipynb 51b837157cc77b0540ef24487423c05b187f5a68
として、1st commit の branch を work directory に展開
Cygwin の Jupyter Notebook で .ipynb を再保存ししたら以下のようにして、author, committer の情報を維持しながら再コミットしてやる。
echo 51b837157cc77b0540ef24487423c05b187f5a68 >commit
./recommit.sh --amend

あとは、ひたすら、
./reset.sh 次のコミットID
# Jupyter Notebook で .ipynb を再保存
./recommit.sh -a
の繰り返し

branch して merge してる部分は 13da1fc
git checkout -b diff-traceable-ipynb2
とか枝を作ってから上記の作業を繰り返し、
fc430aa で merge は diff-traceable-ipynb に戻ってから
git merge diff-traceable-ipynb2
echo fc430aa9c9e8e48becda97adbfce7cb95b6c96c6 >commit
./recommit.sh --amend
のように、一旦 merge したところに、元の commit の情報を --amend で上書きしてた。

.ipynb のフォーマット変換が手動なのが地味に辛い所だが、あとは機械作業と言うか、非人間的作業だった。
こういう作業は RPA つぅかマクロ欲しい。

再構築した repos は以下
Network Graph 以下のように見える。
GitHub の revision の Network Graph は committer date で整列される。
committer date を元の commit に揃えたのはこのため。

コメントをかく


「http://」を含む投稿は禁止されています。

利用規約をご確認のうえご記入下さい

Wiki内検索

フリーエリア

管理人/副管理人のみ編集できます