316

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

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

4

5 に答える 5

378

鍵はgit submodulesです。

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 サブモジュールは優れていますが、実験して学習する必要があります。

大きな力があれば、尻に噛まれる大きなチャンスが訪れます。

于 2009-11-28T06:04:29.157 に答える
30

サブモジュールの代わりにサブツリーを使用することを検討してください。これにより、レポ ユーザーの作業がはるかに楽になります。Pro Git bookでより詳細なガイドを見つけることができます。

于 2012-11-21T15:23:18.950 に答える
20

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

  1. 多くのプロジェクトで使用されている 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 を使用して) 自由に削除できます。

于 2009-11-28T12:39:47.397 に答える
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

フォルダーがリンクされたら、それを参照しているメイン リポジトリ内のフォルダーを無視する必要がある場合があります。それ以外の場合は、問題ありません。

その投稿はこの質問の重複した質問としてマークされていたため、別の投稿から重複した回答を削除したことに注意してください。

于 2016-05-26T17:04:36.370 に答える