web-dev-qa-db-ja.com

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

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

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

260
Brent O'Connor

キーはgit submodulesです。

Git Community Book または sers Manual のサブモジュールの章を読み始めます

リポジトリ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サブモジュールは素晴らしいですが、実験してそれらについて学ぶ必要があります。

強力な力により、部に噛まれる大きなチャンスが訪れます。

329
gahooa

サブモジュールの代わりに subtree を使用することを検討してください。これにより、リポジトリユーザーの生活がずっと楽になります。より詳細なガイドは Pro Git book にあります。

24
Ruslan Kabalin

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

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

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

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

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

  1. メディアファイル用のリポジトリとプロジェクトごとに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を使用して)自由に削除できます。

20
gyim

他の答えが示唆するサブツリーとサブモジュールに問題がありました...主に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

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

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

2
ickydime