2013-03-17 12 views
59

gitでシンボリックリンクを処理する正しい方法は何ですか?Git - シンボリックリンクを処理する方法

Vendors 
    Module A 
    Module B 
    Module C 
App 
Code 
    Modules 
    Core Module 1 
    Core Module 2 
    Module A (symlinked to vendors) 
    Module B (symlinked to vendors) 
    Module C (symlinked to vendors) 

アプリケーション内のコアコードのすべてを含むメインアプリケーションディレクトリがあります:

は、私は次のような構造を持っています。さらに、メインのappディレクトリにシンボリックリンクされ、統合されたモジュールを含むベンダディレクトリがあります。

ベンダーディレクトリとメインアプリディレクトリの両方が同じリポジトリにバージョン管理されていることが重要です。

したがって、私はgitにシンボリックリンクを保管させておくか、シンボリックリンクを無視する方法を見つけるべきでしょうか?

+0

hm私はそれを相対的に作っていて、githubではうまくいきません:(私を助けてくれますか?https://github.com/lingohub/Example-Resource-Files/blob/master/AngularJS/example.en.json –

答えて

117

Gitは、すべての開発者が使用するオペレーティングシステムがサポートしている限り、シンボリックリンクをうまく処理できます。これらのシンボリックリンクがあることに依存しているので、開発環境はすべてシンボリックリンクをサポートしていると想定します。何かがあなたのgitリポジトリか(シンボリックリンクまたはその他)に含まれるべきかどうかを判断するには

は、次の点を考慮してください

  • それは、リポジトリ内のいくつかのツールまたは他のプロセスによって生成されたファイルですか?もしそうなら、それを無視して各ユーザーにファイルを生成させ、常に最新のバージョンを持たせるのが最善です。
  • このファイルは、特定のユーザーの開発環境に固有のファイルですか、またはすべての環境で使用されているファイルですか? Emacsのバックアップファイルを無視する設定のように、特定のユーザの環境の奇妙な点は、リポジトリには属しません。すべての開発者が必要とするもの、および/または本番用のアプリケーションを構築するために必要なものであれば、リポジトリに入れる必要があります。

あなたのケースでは、シンボリックリンクが生成されず、それらがすべての環境で必要なので、それらをリポジトリに配置するのがうまくいくはずです。

しかし、それらを作成するときには絶対的なシンボリックリンクではなく、相対的なシンボリックリンクとして作成して、リポジトリのクローンの場所に関係なく動作させるようにしてください。これを行う最も簡単な方法はmodulesディレクトリにディレクトリを変更して、そこからシンボリックリンクを作成することです:

cd App/Code/Modules 
ln -s "../../../Vendors/Module A" "Module A" 
+40

ハイライト用の相対的なシンボリックリンクのための+1 –

+0

hm私はそれを相対的に作っていて、githubではうまくいきません:(私を助けてくれますか?https://github.com/lingohub/Example-Resource-Files/blob/master/ AngularJS/example.en.json –

+0

ベンダ/モジュールAを変更してGitにプッシュすると、Gitは自動的にApp/Code/Modules/Module Aの内容を更新するのでしょうか? – HasnainMamdani

8

Gitは、シンボリックリンクを除いて、シンボリックリンクの他のファイルと同じように、シンボリックリンクをシンボリックリンクに保存します。

symlinkがディレクトリを指している場合、gitはsymlinkedディレクトリの下にコンテンツを保存しません。

したがって、gitでバージョン管理されているシンボリックリンクを保存することには問題ありません。

シンボリックリンクで気を付けなければならないもう1つのことは、新しく作成されたクローン上のシンボリックリンクを再作成するだけで、それが指しているファイルやディレクトリではありません。シンボリックリンクされたパスが存在しない可能性があります(絶対パスを使用する場合など)。

+0

symlinkディレクトリにあるファイルを追加する方法はありますか? – kraftydevil

+0

@kraftydevil - gitは、シンボリックリンクの対象ディレクトリがgitバージョン管理下にある場合に限り、symlinkディレクトリ下にファイルを追加することができます。シンボリックリンクディレクトリの内容をバージョンアップする必要があります(もしそうでなければならない)symlinkディレクトリ下のメインgitリポジトリディレクトリの外側にあるファイルをバージョンアップしようとすると、何か間違ったことが起きます。 (またはもっと良い 'git subtrees') – Tuxdude

+0

私はJenkinsインスタンスをソース管理下に置いていますが、私はlastSuccessfulビルドの内容を各ジョブに保存したいと思います。それについては後で詳しく説明します。 – kraftydevil

1

@Tuxdudeは「とは全くあなたに同意することはできません...そして、あなたが何か間違ったことをやっています"例として、メディアフォルダをウェブサーバ上の別のドライブまたはNFSに配置する必要がある場合は、バージョンコントロールの外に置く必要があります。したがって、あなたが説明したように、シンボリックリンクされたメディアフォルダ内のコンテンツは、バージョン管理を通じてアクセスできなくなります。しかし、それはあなたがそれをそうする必要があるシナリオです。そして、実際にはBの痛みです...私のシナリオはもっと複雑です(私は詳細には触れません)、私が実際に探しているのはシンボリックリンクされたフォルダのサブフォルダをバージョン管理に追加することですが、私はgitのサブフォルダのタイプ自体の変更を無視できるオプションが必要です。一例として、基本的な構造:

  • アプリ/メディア/ BLA
  • アプリ/メディア/ blubb

私はその内容なしで、Gitのバージョン管理でこれらのフォルダを必要としています。

これらのフォルダは次のようになり(シンボリックリンク)ウェブサーバ(同じバージョン管理)の場合:再び

  • アプリ/メディア/ BLA =>どこか全く他
  • アプリ/メディア/ blubb =>どこか全く他

デベロッパーは、最初の手順(シンボリックリンクなし)で説明したように、オリジナルのバージョン管理された構造のみをローカル環境上に持つ必要があります。しかし、Webサーバーには、さまざまなNFSシステムへのシンボリックリンクがあります。

誰かがこれを解決するためのアイデアを持っていれば、私はそれにはまだ解決策が見つかっていないので、本当に感謝します。

私が今やっている唯一の方法は、ローカル環境用の正しい/異なる構造を作成するビルダーを用意することです。サーバーとメディアサブフォルダは現在gitignoreによって完全に無視されています。しかし、それは時には難しい/維持するのは難しいことがあります。

+0

これは一般的な問題であり、前にも述べたように、バージョン管理には関係しません。ターゲット環境に基づいてシンボリックリンクを設定するための初期化スクリプトを用意することです。 'git clone'の直後に設定してください。 gitのバージョンコントロールに初期化スクリプトを追加します。BTW 'git'は空のディレクトリをバージョン化せず、バージョンファイルのみをgitし、パスを知っています。これは 'git'コマンドのどれかを実行するときにディレクトリ構造を再作成するために使われます。 – Tuxdude

+0

あなたの説明をありがとう、実際には私の現在の設定でそれを行うのとほぼ同じです。私はちょうどもっと快適な方法があると思った。もしgitが普通のファイルとgitignoreの規則などのシンボリックリンクの区別のフラグを持っていれば、いくつかのことは少なくとも少しは簡単でしょう。だから、私はそこに "バージョン管理"との関係があると思うのですが、それは "新機能"として/機能リクエストを通して実装されているかもしれませんが、もっと複雑な場合には、シナリオ。 – ioCron

+0

私は実際にgitがシンボリックリンクをこのように扱う理由を実際に言うことができます。 gitの場合、symlinkは、その内容がsymlinkのターゲットを表すテキストファイルに相当します。このターゲットはgitにシンボリックリンクを追加すると、gitの履歴の一部として追加されます。 – Tuxdude

関連する問題