ラベル Git の投稿を表示しています。 すべての投稿を表示
ラベル Git の投稿を表示しています。 すべての投稿を表示

2017年7月18日火曜日

Git Date Expansion

Webページの最終更新日時を手動で更新するのはやや面倒だしたまに忘れることがあるので自動化したいです。Gitで管理している場合であればattributeを使って自動で更新されるように設定することができます。Gitのattributeについては説明を省くので適宜 Pro Git book 等を参照してください。

さて、今回の要件は次のようになります。

  • Webページ中にLast modified 2017-01-23のような行を保持したい
  • そのような行は最後に更新したときの日時(更新時のdate +%F で得られる値)になるようにしたい
    • amendなどを行なうとGitのコミットに書いてある日時とは異なる点に注意
  • 最終更新日時の情報はcommitされて欲しいがworking treeでは更新されない

まず、htmlファイルに対して"dater"というfilterが適用されるように、.gitattributesに次の内容を書きます。

*.html filter=dater

次にメインの処理内容を書きます。以下の内容を.git/configに追記すれば良いです。working treeからstageされる際にcleanが適用されるので$Last modified$Last modified: $(date +%F)に更新されます。逆にstageの内容をworking treeに戻す際にLast modified:から始まる行を$Last modified$に置換します。これによってworking treeでは最終更新日時の情報は更新されないようになります。

[filter "dater"]
        clean = sed 's/\\$Last modified\\$/Last modified: '$(date +%F)'/'
        smudge = sed 's/\\(Last modified\\):[^<]*/$&$/'

最後に最終更新日時を記述したいファイルに$Last modified$という行を追加することで目標が達成できます。

2016年12月19日月曜日

最近見た不思議なシェルスクリプトを直してみた

この記事は Shell Script Advent Calendar 2016 19日目の記事です。
18日目の記事はryuichiuedaさんの SHELQ: 怪しいシェル芸キュレーションサイト でした。

他の様々なプログラミング言語において良い書き方と悪い書き方があるように、シェルスクリプトにも良い書き方と悪い書き方があります。しかし特にシェルスクリプトの場合は不慣れな人がかなり悪い書き方をしている様です。そこで、幾つかの例を見ながら良い書き方と悪い書き方を比べてみます。

ディレクトリについて再帰的に処理をする

悪い例

$ ls -R | awk '{がんばる}' | 処理

"ls -R" を使うと再帰的にファイルをリストアップすることができます。ということはこの情報を使えば階層の深いファイルについても処理をすることができますね。やった!

良い例

$ find . -print0 | xargs -0 処理 find . -exec 処理 + (あるいは\;)

良く考えてみて下さい。ただ再帰的に処理をするためだけにわざわざ気合を入れてawkでパースする必要があるなら誰かが便利な道具を作っているはずです。こういう場合はfindを使います。findを使えばファイル名や種類、更新日時など様々な条件でファイルを列挙することができます。ただし、xargsに渡す際に空白入りファイル名があると変な場所で区切れるので所定のオプションを付けてヌル文字区切りにすると良いです。

特定のコマンドを実行しているプロセスを列挙する

悪い例

\$ ps ax | grep 実行ファイル名 | grep -v grep | awk '\$0=\$1'
\$ ps ax | grep [実]行ファイル名 | awk '\$0=\$1'

多分何も知らないと最初に挙げている、ps axの結果を実行ファイル名でgrepしてからgrepを弾くようになると思います。しかし実は、一文字に[]を付けても正規表現として内容が変わらないことを利用して自分自身を弾くこともできます。

良い例

$ pgrep 実行ファイル名

プロセス番号以外も取得したいのであれば二つめに挙げた方法を使うのが良いと思いますが、欲しいのがプロセス番号であればpgrepという正にこのために使うものがあります。 (実は少し結果が変わる場合もありますが多分pgrepの挙動が好ましい場合がほとんどだと思います。) さらにプロセスをkillしたいのであればpkillもあるので便利です。環境によっては無いかもしれません。今時のLinux以外の環境のことは知りません。

番外編 (timeout)

ところで僕がこの処理を見たスクリプトは定期的に走らせて前回と同じプロセスが走りっぱなしであれば強制終了するというものでした。これでもいいんですが、単にタイムアウトの処理をやれば済むのであればGNU coreutilsにはtimeoutが入っています。簡単ですね。

時系列ファイル名の最新版取得

ファイル名が「%y%m%d%H%M%S.log」とかで時系列につけられているファイル群のうち、一番新しいのを取得する方法です。ログとか取ってると良くありますね。

悪い例

$ exprを使ってがんばる

もうどうやるのか知りたくもない感じです。80行かけると書けるらしいです。ソートでも実装するんでしょうか。

良い例

$ sort -nr | head -n 1

ソートするだけです。日時は単に数値としてソートしても結果は同じですよね。GNU sortは優秀で、バージョンなど色々な方法でソートできるらしいです。実は数値と辞書順しか使ったことはないですが。

20日目はkunst1080さんの記事です。

2013年2月3日日曜日

GitHub for Windows

最近GitHub for Windowsをたまに使います。概ね使いやすいのですがいくつか思ったことがあるので挙げてみます。因みにあまり使っていないのであらぬ誤解をしているかもしれません。してたらすみません。

いい点

log,diffが見やすい

流石にGUIなのでlogとdiffは見やすいです。丁寧に色までついてますし。

revertの時にcommitのhash値が要らない

GUIなのでコミットを選んでクリックするだけでrevertできます。簡単すぎて怖い位簡単です。

認証が楽

認証は楽です。と言うよりパスワードなどを打つ必要が殆どありません。sshより少ないです。ただ、セキュリティ的に問題があるとも言えるので諸刃の剣ですね。

良くない点

mergeができない

多分できません。つまりworking branchを作って、push,pullの時にmergeするという使い方をしようとするとshellからmergeしないとダメです。githubだと基本個人用レポジトリだからmasterで作業して、失敗してもrevertで戻せばいいということなのだろうか。

submoduleなどちょっと高度な機能が全く使えない

できなそうです。個人的には幾つかは頻繁に使うので不便です。勿論shell使えば問題ないですが。

結局本当に基本的な機能(add,commit,push,pull,log,diff辺り)は凄く楽にできる代わりにちょっと高度な機能を使うならすぐにshellを使わないといけないようですね。GitHubで個人レポジトリを弄っているだけなら大した問題ではなさそうですが、共同開発で使うにはちょっと無理がある感じがします。 まあ結局困ったらshell(Power Shellだけど)開いてコマンド叩けばいいんですが。