にわかプラス

にわかが玄人になることを夢見るサイトです。社会や国際のトレンド、プログラミングや電子工作のことについて勉強していきたいです。

svn:externals / git submoduleで外部リポジトリを参照する方法

sponsor

リポジトリのフォルダ構成を考えるときに、ライブラリやOS部分を自分の管理するソースの近くにおいておきたい、だけどもリポジトリで管理はしたくない。というときがある。 そんな時はチェックアウト時に自動で他のリポジトリからフォルダやファイルを引っ張ってくる、「外部参照」機能を使ってみてはどうでしょうか。

環境

Windows 10
Suvbersion
TortoiseSVN Git(参考)

外部参照機能

リポジトリにあるアプリケーションをチェックアウトするときに、自動他のリポジトリからファイルやフォルダを取得する機能。

Subversionには標準で外部参照の機能があり、結構便利につかえる。

手順(コマンド)

  1. 外部参照したファイル/フォルダを置きたい場所に移動

    sh cd ~/myworkspace

  2. 外部参照を追加

    sh svn propset svn:externals 'LibDir http://svn.util/libs' .

    LibDir : 作成されるディレクトリ名
    http://svn.util/libs : 参照元のリポジトリURL
     . : 外部参照プロパティを設定する場所。1. で移動したフォルダに設定している。

  3. 設定の確認

    sh svn proplist -v

手順(TortoiseSVN)

  1. 外部参照したファイル/フォルダを置きたい場所を右クリック→属性(Properties)を選択

    f:id:hiddenvally333:20200808091553p:plain
    属性(Properties)

  2. 新規(New)をクリック

    f:id:hiddenvally333:20200808102018p:plain
    Propertyの一覧

  3. 属性名(Property name)にsvn:externalsを指定し、以下のように外部参照を追加する

    f:id:hiddenvally333:20200808091549p:plain
    外部参照の設定

外部参照の問題点

問題点というより完全に良し悪しですが、外部参照したフォルダ/ファイルはチェックアウト後と同等の扱いを受ける。つまり変更をコミットできてしまう。

リポジトリを分けて別管理にしていたはずなのに、一度チェックアウトしてしまえば区別無く扱えてしまう。

リポジトリとのリンクを切る方法がないか調べたが、Subversionの機能にはなかった。

外部参照ではなく外部からコピーをする

svn:exportするバッチで解決した。

  1. コピーを取得したいフォルダに移動
  2. exportするバッチを作成しコミット

    sh svn export http://svn.util/libs

  3. チェックアウトし、手動でバッチを起動しexportを完了する

もっといい方法が欲しい・・・。

Gitの場合

Gitにも外部参照を実現するsubmoduleという機能があるよう。

  1. submoduleを設定

    sh git submodule add http://svn.util/libs LibDir

  2. 設定を確認

    sh git status

  3. commitとpushを行い設定を反映

こちらもあくまで参照で、コピーではないもよう。

おわりに

別チームで1つのものを作っている、加えて別々のリポジトリを持っている。と言った場合には、この様にお互いのリポジトリを紐付けられるととても便利。