web-dev-qa-db-ja.com

Gitサブツリーは1つのファイルまたはディレクトリのみ

私は以下のようにGitサブツリーを使用します:

git subtree add --prefix=directory_destination_path --squash [email protected]:kicaj/projectname.git master

しかし、パス内:directory_destination_pathprojectname.gitからすべてのリポジトリをコピーします

directory_destination_pathのみのサブディレクトリ、またはprojectname.gitから一部のファイルのみにコピーする方法は?

編集:
もう1つの質問:
両方のリポジトリで(自動)ファイルの変更を更新する方法は同じでしたか?可能です?

26
kicaj

私が理解しているなら、あなたは別のリポジトリの特定のディレクトリにのみマージしたいと思っているようで、それをリポジトリのサブツリーにしたいのです。 project.gitの対象のディレクトリをpath_of_interest_in_projectと呼び、リポジトリの宛先をdirectory_desination_pathと呼びます。

リモートproject.gitをリモートとして追加してから、そのブランチの1つをローカルでチェックアウトしてみてください。次に、git-subtree splitを使用して、関心のあるproject.gitのディレクトリのみを分割します。その後、サブツリーマージを使用してリポジトリにマージします。

git remote add project [email protected]:kicaj/projectname.git
git branch project_master project/master

ブランチproject_masterは、project.gitリポジトリの履歴全体を保存する必要があります。

次に、git-subtrees-splitプロセスを使用する必要があります。

git checkout -f project_master
git subtree split --squash --prefix=path_of_interest_in_project -b temp_branch

これで、関心のあるディレクトリだけを含むtemp_branchというブランチができました。これで、git-subtree-mergeを実行して、すべてをリポジトリに取り込むことができます。

git checkout -f master
git subtree merge --allow-unrelated-histories --prefix=directory_destination_path temp_branch

これは、temp_branchでマスターブランチにマージする必要があります。

19
eddiemoya

参照masterにoctocatgitリポジトリのimages/プレフィックスを追加したいとします。

https://github.com/octocat/octocat.github.io.git でホストされているリモートを使用するとします(注:GitHubは次のfetchコマンドでerror: Server does not allow request for unadvertised objectを返します。名前付きrefに関連付けられていないsha1を指定します)

サブツリーを追加するブランチから始めて、最初に目的のコミット履歴をフェッチして、新しいブランチをチェックアウトしましょう。

git fetch https://github.com/octocat/octocat.github.io.git master:tmp_octocat_master
git checkout tmp_octocat_master

次に、目的のプレフィックス(images/)の下にあるファイルのみが存在する新しい履歴を作成しましょう。

git subtree split --prefix=images -b subtree_split_branch

最後に、このサブツリーを目的のブランチ(おそらく、最後に使用していたブランチ、git checkout -)に追加しましょう。

git checkout -
git subtree add --prefix=public/images subtree_split_branch

これで、現在のブランチに必要なすべてのファイルがあり、完全なgit履歴があります。

AltSquashedの歴史

サブツリー内のコミットを1つのコミットにまとめたい場合があります。これは、サブツリーを追加する目的をある程度無効にしますが、その場所はあります。以下は、リポジトリに取り込まれる履歴を制限するための上記のバリエーションです。

サブツリーを追加するブランチから開始します。

git fetch --depth=1 https://github.com/octocat/octocat.github.io.git master:tmp_octocat_master
git checkout tmp_octocat_master

注:--depth=1は次の--squashコマンドを使用しているため、上記ではgit subtree splitを指定しています。

git subtree split --squash --prefix=images -b subtree_split_branch
git checkout -
git subtree add --prefix=public/images subtree_split_branch
1
rudolph9