git の設定を task でやりかけてやめた話

に公開

tl;dr

  • .config/git を育てている
  • task で動的生成に変更してみようとした
  • アウトカムがなさすぎる気がしたのでやめた(ので Taskfile.yml を供養)

git

  • 前述のとおり .config/git を設定している
  • global にいろいろ投入しているので設定自体に不満はなかった
  • ignoreCase と fileMode がローカルで差分影響を出した
  • Windows 11 + Ubuntu24 on WSL2 でリポジトリ領域は Windows 側ファイルシステムに置いていた
  • たぶんなにかの拍子に git のなにかにひっかけた
  • Git のドキュメント にも書いてある

やり方を変えてみる

  • いくつかのローカルリポジトリで前述の影響を受けて(受けていないリポジトリもあるのがね、、、)対策を検討した
  • 前述の設定等ローカルに再設定したほうが楽できるものを動的にすればどうか
  • どうせなら config/git 自体を動的生成に変更してしまうのはどうか
  • task ならどこからでも呼べるし楽になる(かも)

やってみた

# yaml-language-server: $schema=https://taskfile.dev/schema.json
version: "3"

# includes:

# optional configurations (output, silent, method, run, etc.)
silent: false

# vars: # Use only uppercase letters for variable names

# env: # followed or replaced by dotenv
# dotenv:
#   - .env
#   - .env.local

tasks:
  # Use kebab case for task names

  config:
    desc: show config
    aliases:
      - c
    cmds:
      # 現在の設定を表示
      - git config --show-scope --show-origin --list

  config:set:global:
    desc: git config --global
    summary: |
      git config --global を実行して初期設定を行う。
      説明とセットにしておくことで、再利用性を向上させる。
      必要に応じて変更すること。
    aliases:
      - csg
    vars:
      CONFIG:
        - key: user.name
          value: "NISHIMURA Yoshitaka"
          desc: "CHANGE REQUIRED: User name for git commits."
        - key: user.email
          value: "officel@users.noreply.github.com"
          desc: "CHANGE REQUIRED: User email for git commits."
        - key: core.autocrlf
          value: false
          desc: "改行コードの自動変換を行わないように false に設定"
        - key: core.fileMode
          value: false
          desc: "実行可能ビットの変更を無視するように false に設定"
        - key: core.ignoreCase
          value: false
          desc: "大文字と小文字の違いを自動で処理しないように false に設定"
    cmds:
      - for: { var: CONFIG }
        cmd: git config --global {{.ITEM.key}} "{{.ITEM.value}}"

  config:set:local:
    desc: git config --local
    aliases:
      - csl
    vars:
      CONFIG:
        - key: core.filemode
          value: false
          desc: "作業ツリー内のファイルの実行可能ビットを尊重するかどうか"
          # false にすると、実行可能ビットの変更を無視する。
          # global の設定を無視してくるケースがあるので local でも設定することにした
    cmds:
      - for: { var: CONFIG }
        cmd: git config --local {{.ITEM.key}} "{{.ITEM.value}}"

実行するとこんなかんじ

$ t g:csg
task: [git:config:set:global] git config --global user.name "NISHIMURA Yoshitaka"
task: [git:config:set:global] git config --global user.email "officel@users.noreply.github.com"
task: [git:config:set:global] git config --global core.autocrlf "false"
task: [git:config:set:global] git config --global core.fileMode "false"
task: [git:config:set:global] git config --global core.ignoreCase "false"

アウトカムがなさすぎる

  • ここまで書いてテストして、まぁ使える、とはなった
  • んだけど、自分用設定はいいとして再利用性が低いなって
  • 設定を外部ファイル化か環境変数化することで再利用性は上げられるけど面倒くさい
  • config/git の config ファイルにコメント付きで書いてあれば済む(config:set:global 要らなくない?)
  • (実際テストして現行と差分がでないようになっている)
  • config:set:local の分も alias すれば済むのでは
  • 何十個も設定したいものがあるならともかく、2,3 個なら要らないなって

というわけで

  • せっかく書いたので taskfile を供養
  • vars の for cmd をテストしたからいっかな
  • ドキュメントには出てないけど map の list を回すのもちゃんとできてるし
  • 手を動かしてみないとわからないことある
  • やってみてダメだったらブログのネタにでもすれば元は取れる(はず)

Discussion