Windows&SourceTreeでの開発環境で、シンボリックリンクの課題に対応した話。


Windows&SourceTree環境下で、シンボリックリンクにはまった。
シンボリックリンクがあるリポジトリでも、支障なく開発できる環境を実現するためにやったことを紹介します。

背景

複数人のメンバーのいる開発環境で、MacとWindowsが混在している状況。
gitクライアントも、CLIの人もいれば、SourceTreeを使っている人もいる。

プロジェクトのリポジトリでは「dev/stg/prd」などの環境は別でも同じファイルを参照させたい場合に、シンボリックリンクでオリジナルのファイルを参照するように構成されている。

こういった状況下で、Windows&SourceTreeを使っているメンバーが、特に何も設定せずにシンボリックリンクのあるリポジトリをクローンすると、シンボリックリンクがリンク先情報が書かれた、ただのテキストファイルになってしまうため、開発に支障があった。

・Macに変える。
・Git操作はWSLでやれ。

そういった乱暴な話は無し。

これを(条件付きではあるが)解決したお話です。

参考ファイル構成(要点抜粋)

terraform
├──dev
│   └── main.tf(←これがシンボリックリンク)
├──stg
│   └── main.tf(←これがシンボリックリンク)
├──prd
│   └── main.tf(←これがシンボリックリンク)
└── main.tf

確認したこと

シンボリックリンクのあるリポジトリを、Windows&SourceTreeでクローンして、何が問題か調べる。
開発で支障があることを洗い出す。

課題

確認してわかったことは以下の通り

1:シンボリックリンクがただのファイルになってしまう

Windows&SourceTreeでクローンすると、シンボリックリンクがただのファイルになってしまいます。

こんな感じ

リンク元ファイルの内容

terraform {
  required_version = "1.0.0"
  required_providers {
    sample = {
      source  = "sample/provider"
      version = "1.0.0"
    }
  }
}

variable "sample_access_token" {}
variable "sample_client_secret" {}
variable "csample_host" {}

provider "sample" {
  config {
    access_token  = var.sample_access_token
    client_secret = var.sample_client_secret
    host          = var.sample_host
  }
}

クローン後のシンボリックリンク
ただのテキストファイルになっている

terraform/dev$ ll
↓
./
../
main.tf*

中の確認

terraform/dev$ cat main.tf
↓
../main.tf

もちろん、terraform init や planなど実行できるわけもない。

本来はこうであってほしい

terraform/dev$ ll
↓
./
../
main.tf -> ../main.tf*

2:シンボリックリンクの変更差分がコミットできない

リポジトリのクローンをWSLで実行し、以降はSourceTreeでAddしてみる案。
シンボリックリンクは生きているが、SourceTreeではシンボリックリンクの変更差分が検知される。
そしてその変更は、エラーでコミットできない状態になる。

実現したいこと

Windows&SourceTreeを使っている環境下のメンバーでも、多少の条件が付いても支障のない状況にする。

適用した設定

SourceTreeの方でシンボリックリンクを有効化する

デフォルトは「core.symlinks=false」になっているので「core.symlinks=true」にする

コマンドプロンプトでの作業

globalの方

C:\Users\{ユーザー名}>cd C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin
C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin>git config --global core.symlinks true
C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin>git config --global -l

~中略

core.symlinks=true(←ここ)

~中略

systemの方

C:\Users\{ユーザー名}>cd C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin
C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin>git config --system core.symlinks true
C:\Users\{ユーザー名}\AppData\Local\Atlassian\SourceTree\git_local\bin>git config --system -l

~中略

core.symlinks=true(←ここ)

~中略

WindowsOS側の設定

デフォルトでは、WIndowsOSでのシンボリックリンクは「Administrator」のみ許可されているので、「Users」にも許可が必要。
※Windows10では、Editionが「Professional」じゃないとできないらしい。と聞いた。(未確認)

ローカル セキュリティポリシー > ユーザ権限の割り当て > シンボリックリンクの作成

ここに「Usersを追加する」

ユーザーまたはグループの追加

詳細設定

グループにチェック入れる

オブジェックト名に「Users」を追加

追加されたので適用する

「シンボリックリンクの作成」に「Users」が追加されていればOK

再ログインすると有効になります。

SourceTreeでクローン

SourceTreeでクローンしてきたファイルを確認します。

エクスプローラーでもシンボリックリンクであると認識しています。

WSLで見ても、ちゃんと期待通りシンボリックリンクのままです

terraform/dev$ ll
./
../
main.tf -> ../main.tf*

VSCode上でもシンボリックリンクと認識しています。

シンボリックリンク側を開いて編集すると、元ファイルも更新されます。

変更も、元ファイルの変更を検知しています。
SourceTreeで操作も可能。

WSLでterraformも実行できます。

ただし、シンボリックリンク作成が必要になったときは、WSLからやってね。

これであれば、開発環境として問題なさそうです。


いかがでしたでしょうか?

今回の目的である「Windows&SourceTreeを使っている環境下のメンバーでも、多少の条件が付いても支障のない状況にする。」を実現することができました。

・Terraformなどのコマンド実行は、WSLでの実行に限定
・SourceTreeのSymbolickLinkの有効化
・Windowsの「ローカル セキュリティポリシー」で、「Users」にシンボリックリンクを許可する。

同じ状況で困っている人の助けになれば幸いです。