12

私はgit-subtree(Avery Pennarunから)を使用しています。現在のgitリポジトリには、もちろんすべてのプロジェクトファイル/フォルダーと「lib」というサブツリーがあります。ここで、このgitリポジトリのクローンを作成git cloneすると、すべてのプロジェクトファイルとサブツリー「lib」(必要なものすべて)が取得されます。今試したこと:複製されたリポジトリのサブツリー「lib」内で何かを変更し、を使用してサブツリー「lib」のリモートリポジトリに変更をプッシュしようとしました git subtree pushが、機能しませんでした。何が問題ですか?最初にgitsubtreeaddを使用してサブツリーとして追加する必要がありますか?

事前にThx

4

2 に答える 2

21

免責事項、私はあなたの数日前にサブツリーについて学習していると思います:-)

使用しているだけの場合git subtree push、変更を抽出してプッシュするのに十分な情報をサブツリーに提供していません。

リポジトリのクローンを正しく作成した場合、サブツリーはすでにそこにあります。サブツリーには、プッシュ元のサブツリーを指定する必要があります(1つしかない場合でも)。また、プッシュ先を知る必要があります。具体的には、トップレベルのリポジトリにプッシュする必要はありません。したがって、次のようなものが必要です。

git subtree push --prefix=lib git@github.com:arges-github/lib.git master

明らかに、リポジトリとrefspecは、リポジトリに一致するように変更する必要があります。

ここで何が起こっているかを調べたい場合(そしてそれは役に立ちます)、サブツリーは実際にサブツリー内のファイルに影響を与える変更を別のブランチに分割し、それをサブツリーリポジトリにプッシュします。これが発生することを確認するには、subtree split

git subtree split --rejoin --branch=shared-changes --prefix=lib

次に、作成したブランチを確認します。

git checkout lib-changes

そして、それらを手動でプッシュします

git push git@github.com:arges-github/lib.git master

これが機能しない場合は、サブツリーをリポジトリにマージしていない可能性があります。サブツリーを追加する場合:

 git subtree add --squash --prefix lib git@github.com:arges-github/lib.git master

また、サブツリーをマージして、トップレベルのリポジトリにプッシュバックする必要があります。

 git subtree pull --squash --prefix lib git@github.com:arges-github/lib.git master
 git push
于 2012-10-10T12:56:42.533 に答える
1

私はあなたが抱えていたのとまったく同じ問題を抱えていました、そして私は本質的にロジャー・ノーランが提案したアプローチを使ってそれを解決しました。ただし、運が悪ければ、私のように大文字と小文字を区別しないファイルシステムを使用する場合は、プルとプッシュを実行するたびに、プレフィックスの大文字と小文字が同じであることを確認する必要があります。

誤ってケースを混同してしまうと、gitはサブツリーが2つあると見なしますが、ファイルシステムには1つしか存在しません。

したがって、私が最終的に得た解決策は(誰かを助ける場合に備えて)次のとおりです。

  1. サブツリーをプッシュするスクリプトを作成します。それを呼び出しますpublish_<your-subtree-name>
  2. サブツリーをプルする別のスクリプトを作成します。それを呼び出しますupdate_<your-subtree-name>
  3. HEADに一時的なブランチを作成し、更新をテストします。スクリプトが正しければ、一時ブランチは移動しません。
  4. サブツリーリポジトリを別の場所に複製し、テストコミットを追加してプッシュし、作成した更新スクリプトを使用してリポジトリにプルしてみます。
  5. すべてが機能する場合は、一時的なブランチを削除して、両方のスクリプトをスーパープロジェクトリポジトリにチェックインします。
  6. 次に、サブツリーをプッシュまたはプルする必要があるときはいつでも、スクリプトを使用します。

PS> --squashパラメーターは重要です。特に、リポジトリのさまざまなブランチがサブツリーのさまざまなブランチをプルしている場合や、プロジェクトに複数のサブツリーがある場合は重要です。

于 2014-12-03T00:33:55.110 に答える