git-wtを使い始めた

なんだかんだgit worktreeめんどくさくて使ってなかったんだけど、流石に仕事量的にgit worktree使わないと回らなくなったんでgit-wtをいれることにした。

使い始めてみたら結構満足している。

.envのコピー機能がある

1
$ git config wt.copyignored true

って書いておけば.envがコピーされる。今Next.jsのプロジェクトで使っているがこれは重宝している。 ただし .gitignore で定義してあるものをコピーする機能なので、node_modules などは別途 wt.nocopy で指定する必要はある。

1
git config --add wt.nocopy "node_modules/"

Next.jsのプロジェクトならこのようにするのがいいかな

1
2
3
  git config wt.copyignored true
  git config --add wt.nocopy "node_modules/"
  git config --add wt.nocopy ".next/"

prismaとかが入ってたらもう少し調整必要かもしれない。
まあでもClaude Codeに以下のようにプロンプト渡せばいい気もする。

1
2
3
https://github.com/k1LoW/git-wt
を使い始めたんだけど、git config wt.copyignored trueを有効にしたんだよね。
コピーしないほうがいいファイルを選定して git config --add wt.nocopyとして設定してほしい

人間が頑張る必要もない。

リモートでマージ済みのworktreeを削除する

git-wtは便利だが、マージ済みのworktreeを一括で削除する機能は存在しない。
並列で開発してどんどんマージする状況だとこれが不便なので自分でスクリプトを作ることで解決したい

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/bin/bash
set -euo pipefail

# git-wt-clean: リモートでマージ済み(gone)のworktreeとブランチを一括削除

git fetch --prune

branches=$(git branch -vv | grep ': gone]' | sed 's/^[* +]*//' | awk '{print $1}')

if [ -z "$branches" ]; then
  echo "削除対象のブランチはありません"
  exit 0
fi

echo "削除対象:"
echo "$branches" | while read branch; do
  echo "  - $branch"
done
echo ""

read -p "削除しますか? [y/N] " answer
if [[ "$answer" != [yY] ]]; then
  echo "キャンセルしました"
  exit 0
fi

echo "$branches" | while read branch; do
  echo "削除中: $branch"
  git wt -d "$branch" 2>/dev/null || echo "  worktreeなし、ブランチのみ削除します" && git branch -d "$branch" 2>/dev/null || true
done

echo "完了"

これをどこかパスの通っているところに git-wt-clean というファイル名で保存すれば、 git wt-clean というgitのサブコマンドでリモートでマージ済みのworktreeを削除できる。

mainブランチに戻る方法がほしかったからコマンド作った

worktreeからmainブランチに戻る方法がcdを使うしかなかったから、それが辛すぎて以下のスクリプトを用意したら便利になった。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
#!/bin/bash
set -euo pipefail

# git-wt-home: メインのworktree(mainブランチ)のディレクトリに移動する

main_worktree=$(git worktree list --porcelain | head -1 | sed 's/^worktree //')

if [ -z "$main_worktree" ]; then
  echo "gitリポジトリ内で実行してください" >&2
  exit 1
fi

cd "$main_worktree"
exec "$SHELL"

これをパスが通っているところに git-wt-home という名前で保存して、 git wt-home とすればmainブランチのディレクトリに戻れる。 複数のworktreeで作業しているような状況だと地味に便利。

カテゴリ

comments powered by Disqus