2

A と B の 2 つのリポジトリを共通のリポジトリ C にマージしたいと考えています。A と B はどちらもルート フォルダー レベルに多くのファイルを持っているため、リポジトリ C のルート フォルダーにフォルダー A と B を作成したいと考えています。 、元の各リポジトリのコンテンツを一致するフォルダーに配置します。

git mvプロセスで使用せずにこれを行うことはありますか? 問題は、残念ながら名前が変更されたファイルの履歴をたどらない Xcode を使用していることです。そのため、可能であれば移動を避けたいと考えています。実際には、各リポジトリをそのサブフォルダーに直接マージしたいと考えています。

4

3 に答える 3

1

これを達成する方法はたくさんあり、この質問に対するブログ投稿とSOの回答は2倍になります。最も簡単な解決策は、おそらくgit-stitch-repoツールを使用することです。

別のオプション(私は試していません)は、このブログ投稿をフォローすることです。しかし、それはかなり厄介であり、サブディレクトリに移動したいドットファイルがある場合は、いくつかの調整が必要になります。

于 2013-03-18T13:15:44.170 に答える
1

Michaelが提案したブログ投稿に基づいて、マージを行うことができました。元の投稿はマスターブランチのマージのみを処理します-マージされたリポジトリからすべてのブランチをプルするように拡張したので、履歴が失われることはありません。

繰り返しになりますが、この種のマージを行うために提案された他の多くの方法を見つけましたが、履歴を保存し、パスの名前を変更しない(Xcodeが履歴の表示に失敗する原因となる)方法はありません。

# Init a git repo which will contain the merge of the two repos, each in its own subdirectory
cd ~/dev
mkdir Merged
cd Merged
git init

# Dummy initial commit to create a master branch
git commit --allow-empty -m "Initial commit"

# Clone first repo
cd ..
git clone <RepoA url>
cd RepoA

# Checkout all branches
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done

# Prepend subdirectory to all committed files paths in all branches
git filter-branch -f --prune-empty --tree-filter ' mkdir -p .sub;
  find . -mindepth 1 -exec mv {} .sub;
  mv .sub RepoA
  ' -- --glob=refs/heads/*

# Garbage cleanup
git gc --aggressive

# Same steps for second repo
cd ..
git clone <RepoB URL>
cd RepoB

# Checkout all branches  
for remote in `git branch -r | grep -v master `; do git checkout --track $remote ; done

# Prepend subdirectory to all committed files paths in all branches
git filter-branch -f --prune-empty --tree-filter ' mkdir -p .sub;
  find . -mindepth 1 -exec mv {} .sub;
  mv .sub RepoB
  ' -- --glob=refs/heads/*

# Garbage cleanup
git gc --aggressive

# Merge modified repos into unified repo
cd ../Merged
git remote add RepoA ../RepoA
git remote add RepoB ../RepoB
git fetch --all
for remote in `git branch -r`; do git checkout -b $remote --track $remote ; done

# Merge wanted branches (usually master) from each original repo into the master branch of the unified repo
git checkout master
git merge RepoA/master
git merge RepoB/master

# Remove remotes
git remote rm RepoA
git remote rm RepoB

# Garbage cleanup
git gc --aggressive

# All done

# Optionally push into a new empty remote repository
git remote add RepoMerged <Merged Repo URL>
git push --all RepoMerged
于 2013-03-20T07:43:40.527 に答える
1
  • サブツリーのマージ— シンプルなソリューションです。一連のファイルをマージして、同時に別のプレフィックス (ディレクトリ) の下に再配置します。それらのファイルの過去の履歴には何もしません。
  • コマンドgit-subtreeを含むスクリプト。add元のコードが常に指定されたディレクトリに配置されているかのように合成履歴を作成します。
于 2013-03-18T13:52:03.240 に答える