別のリポジトリ内でgitリポジトリを使用するにはどうすればよいですか?

StackOverflow https://stackoverflow.com/questions/1811730

質問

さまざまなプロジェクトで使用するJavaScriptとCSSのすべてのマスターファイルとスクリプトを保持しているGitメディアリポジトリがあります。

独自のGitリポジトリにある新しいプロジェクトを作成する場合、新しいプロジェクトでメディアリポジトリのJavaScriptファイルを使用して、スクリプトの両方のコピーを更新する必要がないようにする方法変更しますか?

役に立ちましたか?

解決

キーは gitサブモジュールです。

Git Community Book のサブモジュールの章を読み始めるユーザーズマニュアル

リポジトリPROJECT1、PROJECT2、およびMEDIAがあるとします...

cd /path/to/PROJECT1
git submodule add ssh://path.to.repo/MEDIA
git commit -m "Added Media submodule"

他のリポジトリで繰り返します...

今、クールなことは、MEDIAに変更をコミットするたびに、これを実行できることです:

cd /path/to/PROJECT2/MEDIA
git pull
cd ..
git add MEDIA
git commit -m "Upgraded media to version XYZ"

これは、PROJECT2内のMEDIAサブモジュールがバージョンXYZになったことを記録したものです。

各プロジェクトが使用するMEDIAのバージョンを完全に制御できます。 gitサブモジュールは優れていますが、それらについて実験して学習する必要があります。

  

強力な力があれば、尻に噛みつく絶好のチャンスが訪れます。

他のヒント

私があなたの問題をよく理解しているなら、あなたは次のものが欲しい:

  1. 多くのプロジェクトで使用される単一のgitリポジトリにメディアファイルを保存します
  2. ローカルマシンのプロジェクトのいずれかでメディアファイルを変更した場合、他のすべてのプロジェクトにすぐに表示されるはずです(常にコミット+プッシュ+プルしたくない)

残念ながら、あなたが望むものに対する究極の解決策はありませんが、あなたの人生を楽にすることができるいくつかのことがあります。

まず、1つの重要なことを決定する必要があります。プロジェクトリポジトリのすべてのバージョンについて、メディアファイルのバージョンへの参照を保存しますか?たとえば、example.comというプロジェクトがある場合、2週間前に使用したstyle.cssを知っている必要がありますか、それとも常に最新(またはほとんど)が最適ですか?

それを知る必要がない場合、解決策は簡単です:

  1. メディアファイル用のリポジトリと各プロジェクト用のリポジトリを作成
  2. ローカルにクローン化されたメディアリポジトリを指すシンボリックリンクをプロジェクトに作成します。相対シンボリックリンク(例:../media)を作成し、メディアディレクトリが同じ場所にあるように全員がプロジェクトをチェックアウトすることを想定するか、シンボリックリンクの名前を.gitignoreに書き込み、誰でも決定できます。彼/彼女がメディアファイルを置く場所。

ただし、ほとんどの場合、このバージョン情報を知りたいと思うでしょう。この場合、次の2つの選択肢があります。

  1. すべてのプロジェクトを1つの大きなリポジトリに保存します。このソリューションの利点は、メディアリポジトリのコピーが1つしかないことです。大きな欠点は、プロジェクトのバージョンを切り替えるのがはるかに難しいことです(別のバージョンにチェックアウトする場合は、常にすべてのプロジェクトを変更します)

  2. サブモジュールを使用します(回答1で説明)。この方法では、メディアファイルを1つのリポジトリに保存し、プロジェクトには特定のメディアリポジトリバージョンへの参照のみが含まれます。ただし、この方法では通常、メディアリポジトリのローカルコピーが多数あり、すべてのプロジェクトでメディアファイルを簡単に変更することはできません。

私があなただったら、おそらく最初または3番目のソリューション(シンボリックリンクまたはサブモジュール)を選択するでしょう。サブモジュールを使用することを選択した場合でも、生活を楽にするために多くのことができます:

  1. コミットする前に、サブモジュールディレクトリの名前を変更し、共通メディアディレクトリへのシンボリックリンクを配置できます。コミットする準備ができたら、シンボリックリンクを削除し、サブモジュールを削除してからコミットし直します。

  2. メディアリポジトリのコピーの1つをリモートリポジトリとしてすべてのプロジェクトに追加できます。

この方法でローカルディレクトリをリモートとして追加できます:

cd /my/project2/media
git remote add project1 /my/project1/media

/ my / project1 / media内のファイルを変更した場合、リモートサーバーにプッシュせずに/ my / project2 / mediaからファイルをコミットおよびプルできます。

cd /my/project1/media
git commit -a -m "message"
cd /my/project2/media
git pull project1 master

これらのコミットは、他のユーザーと共有していないため、後で(git resetを使用して)自由に削除できます。

他の回答が示唆するサブツリーとサブモジュールに問題がありました...主にSourceTreeを使用しているため、かなりバグがあるようです。

代わりに、SymLinksを使用することになりましたが、それはうまく機能しているように見えるので、代替手段としてここに投稿しています。

ここに完全なガイドがあります: http://www.howtogeek.com/howto/16226/complete-guide-to-symbolic-links-symlinks-on-windows-or-linux/

ただし、基本的には、昇格したコマンドプロンプトで2つのパスをmklinkするだけです。必ず/ Jハードリンクプレフィックスを使用してください。これらの行に沿ったもの:mklink / J C:\ projects \ MainProject \ plugins C:\ projects \ SomePlugin

相対的なフォルダーパスを使用して、各ユーザーがプロジェクトを最初にチェックアウトしたときに実行されるように、バットに入れることもできます。

例: mklink / J。\ Assets \ TaqtileTools .. \ TaqtileHoloTools

フォルダがリンクされたら、それを参照しているメインリポジトリ内のフォルダを無視する必要がある場合があります。そうでなければ、行ってもいいです。

別の投稿から重複した回答として削除されたのは、その投稿がこの質問と重複する質問としてマークされたためです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top