2281 Stimmen

Wie führt man zwei Git-Repositories zusammen?

Stellen Sie sich das folgende Szenario vor:

Ich habe ein kleines experimentelles Projekt A in einem eigenen Git Repo entwickelt. Jetzt ist es ausgereift, und ich möchte, dass A Teil des größeren Projekts B ist, das sein eigenes großes Repository hat. Ich möchte nun A als Unterverzeichnis von B hinzufügen.

Wie kann ich A mit B verschmelzen, ohne dass die Geschichte auf irgendeiner Seite verloren geht?

17 Stimmen

Wenn Sie nur versuchen, zwei Repositories zu einem einzigen zusammenzufassen, ohne beide Repositories behalten zu müssen, werfen Sie einen Blick auf diese Frage: stackoverflow.com/questions/13040958/

0 Stimmen

Für das Zusammenführen von Git Repo in einem benutzerdefinierten Verzeichnis mit Speicherung aller Comits verwenden Sie stackoverflow.com/a/43340714/1772410

10voto

Rian Punkte 1183

Ich habe versucht, die gleiche Sache für Tage zu tun, ich bin mit Git 2.7.2. Subtree nicht bewahren die Geschichte.

Sie können diese Methode verwenden, wenn Sie das alte Projekt nicht wieder verwenden wollen.

Ich würde vorschlagen, dass Sie zuerst in die Zweigstelle B gehen und in der Zweigstelle arbeiten.

Hier sind die Schritte ohne Verzweigung:

cd B

# You are going to merge A into B, so first move all of B's files into a sub dir
mkdir B

# Move all files to B, till there is nothing in the dir but .git and B
git mv <files> B

git add .

git commit -m "Moving content of project B in preparation for merge from A"

# Now merge A into B
git remote add -f A <A repo url>

git merge A/<branch>

mkdir A

# move all the files into subdir A, excluding .git
git mv <files> A

git commit -m "Moved A into subdir"

# Move B's files back to root    
git mv B/* ./

rm -rf B

git commit -m "Reset B to original state"

git push

Wenn Sie nun eine der Dateien in Unterverzeichnis A protokollieren, erhalten Sie den vollständigen Verlauf

git log --follow A/<file>

Dies war der Beitrag, der mir dabei geholfen hat:

http://saintgimp.org/2013/01/22/merging-two-git-repositories-into-one-repository-without-losing-file-history/

7voto

jettero Punkte 805

Ich weiß, es ist lange her, aber ich war mit den anderen Antworten, die ich hier gefunden habe, nicht zufrieden, also habe ich dies geschrieben:

me=$(basename $0)

TMP=$(mktemp -d /tmp/$me.XXXXXXXX)
echo 
echo "building new repo in $TMP"
echo
sleep 1

set -e

cd $TMP
mkdir new-repo
cd new-repo
    git init
    cd ..

x=0
while [ -n "$1" ]; do
    repo="$1"; shift
    git clone "$repo"
    dirname=$(basename $repo | sed -e 's/\s/-/g')
    if [[ $dirname =~ ^git:.*\.git$ ]]; then
        dirname=$(echo $dirname | sed s/.git$//)
    fi

    cd $dirname
        git remote rm origin
        git filter-branch --tree-filter \
            "(mkdir -p $dirname; find . -maxdepth 1 ! -name . ! -name .git ! -name $dirname -exec mv {} $dirname/ \;)"
        cd ..

    cd new-repo
        git pull --no-commit ../$dirname
        [ $x -gt 0 ] && git commit -m "merge made by $me"
        cd ..

    x=$(( x + 1 ))
done

2 Stimmen

Das war genau das, wonach ich gesucht habe. Danke! Allerdings musste ich Zeile 22 ändern in: if [[ $dirname =~ ^.*\.git$ ]]; then

2 Stimmen

^.*blarg$ ist verschwenderisch gierig RE. Besser ist es, .blarg$ zu sagen und den vorderen Anker wegzulassen.

7voto

Eric Lee Punkte 7061

Wenn Sie einfach nur zwei Repositories zusammenfügen wollen, sind Submodule und Subtree Merges das falsche Werkzeug, da sie nicht die gesamte Dateihistorie beibehalten (wie bereits in anderen Antworten angemerkt wurde). Siehe diese Antwort aquí für den einfachen und korrekten Weg, dies zu tun.

2 Stimmen

Ihre Lösung funktioniert gut nur für neue Repository, aber wie über die Zusammenführung repo in einem anderen mit Dateikonflikten?

6voto

David Lemphers Punkte 3480

Ich stand vor einer ähnlichen Herausforderung, aber in meinem Fall hatten wir eine Version der Codebasis in Repository A entwickelt und diese dann in ein neues Repository, Repository B, für die neue Version des Produkts geklont. Nachdem wir einige Fehler in Repository A behoben hatten, mussten wir die Änderungen in Repository B einpflegen:

  1. Hinzufügen einer Fernbedienung zu Repository B, die auf Repository A verweist (git remote add...)
  2. Ziehen des aktuellen Zweigs (wir haben master nicht für Fehlerbehebungen verwendet) (git pull remoteForRepoA bugFixBranch)
  3. Zusammenführungen nach Github verschieben

Hat wunderbar funktioniert :)

6voto

Zusammenführung von 2 Repos

git clone ssh://<project-repo> project1
cd project1
git remote add -f project2 project2
git merge --allow-unrelated-histories project2/master
git remote rm project2

delete the ref to avoid errors
git update-ref -d refs/remotes/project2/master

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X