別のリポジトリ内のgitリポジトリをどのように操作しますか?


283

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

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


@ ruslan-kabalinから以下のサブツリーの 回答を参照してください。注:pre-commit(またはovercommit)フックは、Robert Dundon
Hedgehog

回答:


347

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

Gitコミュニティブックまたはユーザーマニュアルのサブモジュールの章を読み始める

リポジトリ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"

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

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

大きな力には、しこりに噛まれる大きなチャンスがあります。


このワークフローは、プライベートNPMモジュールstackoverflow.com/questions/7575627/…の
cyrf

デフォルトを最新バージョンにする場合は、スクリプトを追加して、MEDIAコミットをすべての依存プロジェクトに伝達できます。
jiggunjer

3
これはどのようにgithubと統合されますか?
theonlygusti 2017年

26

サブモジュールの代わりにサブツリーを使用することを検討してください。これにより、レポユーザーの生活がはるかに簡単になります。より詳細なガイドはPro Gitブックにあります。


6
これは、サブツリーとサブモジュールのもう1つの有益な記事です:blogs.atlassian.com/2013/05/…–
Benny Neugebauer

3
この記事によると、欠点の1つは次のとおりです。>コミットでスーパーコードとサブプロジェクトコードを混在させない責任はあなたにあります。そのための時間は誰にもありませんでした(IMO)
Robert Dundon '22

20

私があなたの問題をよく理解しているなら、あなたは以下のものを望んでいます:

  1. メディアファイルを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を使用して)自由に削除できます。


1
Apacheのwwwフォルダー内から作業するWeb関連プロジェクト.htaccessの場合は、wwwフォルダーまたはプロジェクトのルートにファイルを配置するか、ファイルをその中に配置するかOptions +FollowSymLinks、またはさらに良い方法<IfModule mod_rewrite.c>{new line}Options +FollowSymLinks{new line}RewriteEngine on{new line}</IfModule>{new line}実際の改行で置き換える)

3

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

代わりに、結局SymLinksを使用することになり、それはうまくいくように見えるので、可能な代替策としてここに投稿します。

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

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

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

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

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

注:投稿がこの質問に対する重複質問としてマークされていたため、別の投稿から重複回答を削除しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.