問題タブ [git-subtree]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
git - サブディレクトリを別の Git リポジトリに切り離す (移動する)
多数のサブディレクトリを含むGitリポジトリがあります。現在、サブディレクトリの 1 つが他のサブディレクトリと無関係であり、別のリポジトリにデタッチする必要があることがわかりました。
サブディレクトリ内のファイルの履歴を保持しながら、これを行うにはどうすればよいですか?
クローンを作成して各クローンの不要な部分を削除することもできると思いますが、これにより、古いリビジョンなどをチェックアウトするときに完全なツリーが得られると思います。これは許容されるかもしれませんが、 2 つのリポジトリには共有履歴がありません。
明確にするために、次の構造を持っています。
しかし、代わりにこれが欲しい:
git - 更新をサブツリーにマージするときに Git が混乱する
以前はメイン リポジトリで多くのサブモジュールを使用していましたが、プロジェクトの保守性を高めるために、実験的なブランチを開始し、それらをすべてサブツリーに置き換えました。
これはうまくいきましたが、サブツリーの1つを更新しようとすると、更新がサブツリーではない完全に間違ったディレクトリに誤ってマージされます。
ブランチ「サブツリー」に実験的なブランチが含まれるメイン リポジトリは、次のとおりです: git://github.com/hugowetterberg/goodold_drupal.git
更新をマージするリポジトリ: git://github.com/voxpelli/drupal-oembed.git
実行によるマージ: git merge -s subtree oembed/master
更新をマージするパス: sites/all/modules/oembed/
それらがマージされるパス: modules/aggregator/translations/
更新をサブツリーに入れる方法やエラーの原因を知っている人はいますか?
git - 2つのGitリポジトリをどのようにマージしますか?
次のシナリオを検討してください。
私は独自のGitリポジトリで小さな実験プロジェクトAを開発しました。今では成熟しているので、Aは独自の大きなリポジトリを持つより大きなプロジェクトBの一部になりたいと思います。ここで、AをBのサブディレクトリとして追加します。
どちらの側でも履歴を失うことなく、AをBにマージするにはどうすればよいですか?
git - MagentoでGitを使用するためのベストプラクティスは?
私は、ベンダーのライブラリ(この場合はMagento)と統合しながら、カスタムコードの自分のリポジトリ内で最適に機能する方法を模索しています。私の場合、ベンダーにパッチをプッシュする必要はありません(ただし、それは大きな副次的なメリットになります)。
gitサブモジュールとgitサブツリーを調べました。私はgitサブモジュールが私が必要とするもののために働くとは思わない。Magentoには、次のタイプのツリー構造があります。
gitサブモジュールの使用は、別々のフォルダーで最適に機能するようです(たとえば、/はアプリで、/ vendor / magentoはサブモジュールです)。ただし、この程度の絡み合いでは、サブモジュールは適切なソリューションとは思えません。私はこれについて間違っていますか?
それは私にgitサブツリーを残します。しかし、gitサブツリーでは、同じコアの仮定(ベンダーブランチは、名前が示すように、サブツリーである)は当てはまりません。Magentoはサブツリーではありませんが、私のプロジェクトが収まるコアライブラリです。あれは正しいですか?
これらの2つのgitの方法が機能しない場合、私が達成しようとしていることを実行するために知っておくべき他の方法はありますか?
私が追求するのを嫌がる最後のオプションは、レポを用意して、それを最新のベンダーの変更(tarballからプルイン)に適用することです。ベンダーのログ情報( https://github.com/magentomirror/magento-mirrorから取得)を入手すると、新しい更新を並べ替えたり、どのような変更が影響を受けたかを把握したりするのに非常に役立つと思うので、これを追求するのは気が進まない。 。
git - ブランチを使用せずに、同じベース ディレクトリに 2 つの Git リポジトリを作成する方法は?
現在、Magento Enterprise (電子商取引 Web アプリケーション) ファイルを Git に移行中です。httpdocs/.gitignore ファイルには、特に以下が含まれています。
httpdocs/ を初期化、コミット、プッシュした後、最初の Git リポジトリが正常に作成されました。ここで、前述のディレクトリの両方を独自の個別のリポジトリに配置します。(一緒に、単一のリポジトリで!) ここで遭遇する問題は、これらのディレクトリが、最初の Git リポジトリを既に含む共通のルートを共有していることです。つまり: httpdocs/
サブモジュール機能を使用して、既存のツリーのサブディレクトリ内に他のリポジトリを埋め込むことができることを読みました。ただし、kernel.orgやgit-scm.comなどのドキュメントは非常に複雑に見えるため、これが本当に進むべき道なのか疑問に思うほどです。必要なのは 2 つの別個のリポジトリだけです。たまたま同じルートを持っているだけです。
私が読んだ別の可能な解決策は、これらのディレクトリを結合するために、 app/design/frontend/company/website/ から初期化し、接ぎ木点として skin/frontend/company/website/ を追加することです。ただし、これも非常に複雑に思えます。むしろ、別のリビジョン管理システムから Git に移行するときに使用することを目的としています。
git - git-subtreeは履歴を保持していないため、サブツリーの変更をプッシュできません。これを修正する/将来この問題を回避するにはどうすればよいですか?
メインプロジェクト内のサブプロジェクトを管理するために、git-subtree拡張機能(https://github.com/apenwarr/git-subtree )を使用しています。サブプロジェクトに加えられた変更をメインプロジェクトから分割しようとすると失敗するという事実以外は、私が望んでいることを正確に実行しています。
たとえば、以前に私がやった
メインプロジェクトのSome/Sub/Dirにライブラリコードを取り込みます。ここのすべてがうまくいったので、私は変更を中央のメインプロジェクトの裸のgitリポジトリにプッシュしました。次に、Some / Sub / Dirでローカルバージョンのライブラリに変更を加え、コミットしてから分割して、lib.gitリポジトリにプッシュすることにしました。
すべてが期待どおりに機能します。リポジトリのローカルコピーはもう必要ありません。削除しました。
中央リポジトリからリポジトリの新しいコピーを複製した後、Some / Sub / Dirのlibにいくつかの変更を加え、それらの変更を分割してlib.gitリポジトリにプッシュバックすることにしました。以前と同じサブツリー分割コマンドを使用しようとしましたが、今回は次の出力になります。
d76a03f0ec7e20724bcfa253e6a03683211a7bb1は、サブツリーを追加したときのものです。
これは実際にはlib.gitリポジトリのコミットを指します。
私がつなぎ合わせることができたのは(そして私はgit noobなので、間違っているか、何かを見落としているか、ここで間違った用語を使用している可能性があります)、「git subtree add --squash」は、リモートのlib.gitレポジトリを現在のレポジトリに押し込み、別のコミットに押しつぶしてから、そのコミットを作業ブランチに追加します。lib.gitのコミット履歴は現在のリポジトリに残りますが、スカッシュコミットのテキスト以外では実際に参照されていないため、コミットがぶら下がっています。それらのぶら下がりコミットが残っている限り、git-subtreeはそれらを使用して分割を実行できますが、プッシュまたはプルにはぶら下がりオブジェクトが含まれていないため(または、gcを実行してぶら下がりオブジェクトを完全に削除した場合)、それらのぶら下がりコミットは失われ、 git-subtreeには、分割を実行するために必要な情報がありません。
私が抱えていた問題を完全に再現するスクリプトを追加しました。
私の質問は次のとおりです。
1)元のリポジトリにマージしたいサブツリーがあり、それらをリンクする履歴がなくなったという既存の状況を処理するにはどうすればよいですか。私の現在の考えは、次のようなことをすることです。
'git subtree add'以降のすべての履歴を分割し、元のリポジトリにマージして戻します(ありがたいことに、追加以降、変更はありません)。これが最善の方法ですか?マージを実行する方法に関する推奨事項はありますか?
2) git-subtreeを期待どおりに機能させるためにできることはありますか?'git subtree add'の--squashパラメーターを省略すると、すべてが機能すると思いますが、それにより、無関係な履歴の束がリポジトリに挿入されます。必要なコミットを維持する方法はありますか(できれば、ライブラリの履歴全体を維持することなく)?
git - git:プロジェクトからライブラリを分割するには? フィルタブランチ、サブツリー?
それで、私はより大きな(クローズドソース)プロジェクトを持っており、このプロジェクトのコンテキストで、他の場所でも役立つ可能性のあるライブラリを作成したと思います.
私は今、ライブラリを独自のプロジェクトに分割したいと考えています。これは、github などでオープン ソースとして使用できます。もちろん、ライブラリ (およびそこにあるその履歴) には、プロジェクトの痕跡が含まれていてはなりません。
ここでは git-subtree が解決策のように思えますが、完全には適合しません。
私のディレクトリレイアウトは次のようなものです(Javaプロジェクトであるため):
- フェンシングゲーム (git workdir)
- ソース
- で
- フェンシング_ゲーム
- トランスポート (私のライブラリ)
- プロトコル (ライブラリの一部)
- フェンシング(ライブラリと接続するメイン プロジェクトの一部)
- クライアント(ライブラリと接続するメイン プロジェクトの一部)
- サーバー(ライブラリと接続するメイン プロジェクトの一部)
- クライアント(メイン プロジェクトの一部)
- サーバー(メイン プロジェクトの一部)
- ... (メインプロジェクトの一部)
- トランスポート (私のライブラリ)
- フェンシング_ゲーム
- で
- その他のファイルとディレクトリ (ビルド システム、Web サイトなど - メイン プロジェクトの一部)
- ソース
分割後、ライブラリのディレクトリ レイアウトを次のようにします (太字のディレクトリにあるすべてのファイルを含む)。
- my-library (名前は未定)
- ソース
- で
- フェンシング_ゲーム
- トランスポート (私のライブラリ)
- プロトコル (ライブラリの一部)
- トランスポート (私のライブラリ)
- フェンシング_ゲーム
- で
- ソース
履歴には、リポジトリのこの部分に関係するメイン プロジェクトの履歴の一部のみが含まれている必要があります。
一目見ただけでわかりましgit-subtree split --prefix=src/de/fencing_ame/transport
たが、これは
transport
(コンパイルされない) に根ざしたツリーを教えてください。transport/client
、transport/server
およびtransport/fencing
ディレクトリを含めます。
最初の点は受信側で使用することで軽減できますがgit subtree add --prefix=src/de/fencing_ame/transport <commit>
、git-subtree がこれらのサブディレクトリのエクスポートに対してもあまり効果がないと思います。(アイデアは、ここで完全なツリーを共有できるようにすることです)。
ここを使わないといけないのgit filter-branch
?
分割後、 git-subtree または git-submodule を使用して、メイン プロジェクトのライブラリを現在の場所ではなく別のサブディレクトリにインポートできるようにしたいと考えています。レイアウトはこんな感じ
- フェンシングゲーム (git workdir)
- ソース
- で
- フェンシング_ゲーム
- トランスポート (空)
- フェンシング(ライブラリと接続するメイン プロジェクトの一部)
- クライアント(ライブラリと接続するメイン プロジェクトの一部)
- サーバー(ライブラリと接続するメイン プロジェクトの一部)
- クライアント(メイン プロジェクトの一部)
- サーバー(メイン プロジェクトの一部)
- ... (メインプロジェクトの一部)
- トランスポート (空)
- フェンシング_ゲーム
- で
- マイライブラリ
- ソース
- で
- フェンシング_ゲーム
- トランスポート (私のライブラリ)
- プロトコル (ライブラリの一部)
- トランスポート (私のライブラリ)
- フェンシング_ゲーム
- で
- ソース
- その他のファイルとディレクトリ (ビルド システム、Web サイトなど - メイン プロジェクトの一部)
- ソース
git - Gitサブツリーワークフロー
現在のプロジェクトでは、オープンソースフォーラム(https://github.com/vanillaforums/Garden)を使用しています。私はこのようなことをすることを計画していました:
このようにして、バニラフォルダーに変更を加え(構成の変更など)、マスターブランチにコミットできます。また、バニラブランチに切り替えて、更新をフェッチすることもできます。私の問題は、ブランチをマージしようとしたときです
問題は、「更新コミット」が私のコミットの上にあり、私の変更を「上書き」することです。アップデートの上にコミットを再生してもらいたいです。それを行う簡単な方法はありますか?私はgitがあまり得意ではないので、これは間違ったアプローチかもしれません。また、自分の歴史とバニラの歴史を混ぜたくありません。
git-submodules - Git サブモジュールに代わるものはありますか?
Git サブモジュールを使用することは、私の開発ワークフローにとって何となく面倒だと感じています。Git サブツリーと Gitslave について聞いたことがあります。
- 複数のリポジトリ プロジェクト用のツールは他にもありますか? また、それらをどのように比較しますか?
- これらのツールは Windows で実行できますか?
git - Gitサブツリーマージ戦略またはサブツリーコマンド?
デザイナーとコラボレーションする新しいZendFrameworkプロジェクトを開始しています。私はこのプロジェクトコードをgitを使用して維持し、通常、デザイナーはgit(またはプログラミング言語)を話さないので、彼のために物事を簡単にしたいです。そうしないと、彼はgitをまったく使用しないのではないかと思います。私の計画は彼にいくつかのGitGUIを与えることであり、それで彼はcommit、diff、fetch、merge、push、pullなどの基本的なgit機能のみを使用する必要があります。
gitリポジトリの共有コピーを維持するためにgitoliteを使用しています。これにはきめ細かい権限システムがあるため、専用のブランチ(デザイン)に対してのみデザイナーのRWアクセスを許可し、他のブランチへの読み取りアクセスを許可します。
簡単にするために、メインプロジェクト( ZF推奨の構造に従う)の一部のフォルダーのみを彼と共有したいと思います。彼はその仕事をするためにアクセスする必要があります。同時に、私は私たちの両方がまだお互いからマージできることを望んでいます。
彼のブランチの縮小された構造は次のようになります。
このタスクにサブモジュールを使用できることはわかっていますが、プロジェクトを(少なくとも)4つのサブリポジトリに分割する必要があり、サブリポジトリにのみアクセスでき、3つのリポジトリを使用できるため、維持するのは面倒です。 。このため、これが唯一の解決策である場合、私はこのアイデアをあきらめます。
私がすでに読んだいくつかのリンクは、私が求めていることが可能であると私に思わせます:
これが私の質問です:
- 縮小ブランチを作成する方法
design
(git checkout -b design
およびgit mv/rm
?) - ブランチ間で編集を追跡するようにgitを構成する方法(
git merge design
マスターブランチから、またはその逆を行うことができます)
アップデート:
私はこれらの2つのSOの質問によって与えられた問題への別の可能なアプローチを見つけました
デザインブランチで最初のアフターを実装しようとしgit rm all-unneeded-stuff
ましたが、マスターブランチでコミットします。これには、ホワイトリストに登録されたパスのファイルとブラックリストに登録されたパスの別のファイルが含まれますがgit merge
、次のメッセージで失敗します。
次に、マスターブランチに新しいディレクトリを追加し、デザインからマージするときに新しいディレクトリが追加されます。ドライバーにデバッグエコーを入れましたが、どちらの場合も呼び出されていないことがわかりました。おそらく、実際のマージではないためです。
2番目のアプローチ(.gitignoreのアプローチ)はまだ試していませんが、デザインブランチでブラックリストに登録されたファイルのみを無視するため、このアプローチが私のニーズに合わないことを理解している場合は、デザインブランチ、私の要件を破る。
アップデート2:
現在、その解決策はないと思います。現在のgit実装では、これは単純に達成できません。
矛盾したいのですが、起こらないのではないかと思います。