80

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にシンボリックリンクを保存し続けるようにする必要がありますか、それともシンボリックリンクを無視する方法を見つける必要がありますか?

4

3 に答える 3

144

Gitは、すべての開発者が使用するオペレーティングシステムがシンボリックリンクをサポートしている限り、シンボリックリンクを問題なく処理できます。これらのシンボリックリンクが存在することに依存しているため、開発環境はすべてシンボリックリンクをサポートしていると想定します。

何かをgitリポジトリに含めるかどうか(シンボリックリンクなど)を決定するには、次のことを考慮してください。

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

あなたの場合、シンボリックリンクは生成されておらず、すべての環境で必要であるように思われるので、リポジトリに配置しても問題ありません。

ただし、それらを作成するときは、リポジトリが複製されている場所に関係なく機能するように、絶対シンボリックリンクではなく相対シンボリックリンクとして作成してください。これを行う最も簡単な方法は、ディレクトリをModulesディレクトリに変更し、そこからシンボリックリンクを作成することです。

cd App/Code/Modules
ln -s "../../../Vendors/Module A" "Module A"
于 2013-03-17T20:01:20.817 に答える
13

Gitは、バージョン管理内の他のファイルと同じようにシンボリックリンクを保存します。シンボリックリンクを除いて、シンボリックリンク先のパスに関する情報のみを保存し、ファイルタイプは通常のファイルではなくシンボリックリンクとして保存します。

シンボリックリンクがディレクトリを指している場合、gitはシンボリックリンクされたディレクトリの下にコンテンツを保存しません。

したがって、あなたのケースではgitでバージョン管理されたシンボリックリンクを保存しても害はありません。

シンボリックリンクで注意する必要があるもう1つのことは、gitは、ポイントしているファイルやディレクトリではなく、新しいクローンでのみシンボリックリンクを再作成するということです。シンボリックパスが存在しない可能性があります(たとえば、絶対パスを使用する場合)。

于 2013-03-17T19:59:01.337 に答える
1

@Tuxdude「...それならあなたは何か間違ったことをしている」とはまったく同意できません。たとえば、メディアフォルダをWebサーバーまたはNFSの別のドライブに配置する必要がある場合は、バージョン管理の外部に配置する必要があります。そのため、説明したように、シンボリックリンクされたメディアフォルダー内のコンテンツには、バージョン管理を介してアクセスできません。しかし、それはあなたがそのようにそれをしなければならないシナリオです。そして、それは本当に苦痛です...私のシナリオはさらに複雑です(詳細には説明しません)。実際に探しているのは、シンボリックリンクされたフォルダーのサブフォルダーをバージョン管理に追加することですが、その内容は追加しませんが、 gitのサブフォルダータイプ自体の変更を無視できるオプションが必要です。例として、基本構造は次のとおりです。

  • app / media / bla
  • app / media / blubb

gitバージョン管理でそれらのフォルダーが必要ですが、その内容は含まれていません。

Webサーバー(同じバージョン管理)では、これらのフォルダーは次のようになります(シンボリックリンク)。

  • app / media /bla=>完全に別の場所
  • app / media /blubb=>まったく別の場所

開発者は、最初のステップで説明したように、ローカル環境に元のバージョン管理された構造だけを持っている必要があります(シンボリックリンクなし)。ただし、WebサーバーにはさまざまなNFSシステムへのシンボリックリンクがあります。

誰かがこれを解決する方法を知っているなら、私はまだそれに対する解決策を見つけていないので、私はそれを本当に感謝します。

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

于 2016-05-25T00:29:55.060 に答える