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

3voto

Collin Anderson Punkte 13449

Ich führe Projekte leicht manuell zusammen, so dass ich mich nicht mit Konflikten bei der Zusammenführung befassen muss.

Kopieren Sie zunächst die Dateien aus dem anderen Projekt, wie Sie sie haben wollen.

cp -R myotherproject newdirectory
git add newdirectory

nächster Zug in der Geschichte

git fetch path_or_url_to_other_repo

Git anweisen, die Geschichte der zuletzt geholten Sache einzubinden

echo 'FETCH_HEAD' > .git/MERGE_HEAD

Jetzt können Sie die Übergabe so durchführen, wie Sie sie normalerweise durchführen würden

git commit

1 Stimmen

Dies war die einzige Lösung, die Sinn machte und genau das tat, was ich wollte und erwartete.

3voto

Ngen CMS Punkte 106

Ich musste es heute wie folgt lösen: Projekt A war in Bitbucket und Projekt B war in Code Commit beides sind die gleichen Projekte, aber ich musste Änderungen von A nach B zusammenführen. (Der Trick ist, den gleichen Namen Zweig in Projekt A zu erstellen, der gleiche wie in Projekt B)

  • git checkout Projekt A
  • git remote remove origin
  • git remote add origin Projekt B
  • git checkout branch
  • git add *
  • git commit -m "wir haben den Code verschoben"
  • Git-Push

2voto

Andrey Izman Punkte 1621

Diese Funktion klont das entfernte Projektarchiv in das lokale Projektarchiv-Verzeichnis, nach dem Zusammenführen werden alle Übertragungen gespeichert, git log werden die ursprünglichen Übertragungen und die richtigen Pfade angezeigt:

function git-add-repo
{
    repo="$1"
    dir="$(echo "$2" | sed 's/\/$//')"
    path="$(pwd)"

    tmp="$(mktemp -d)"
    remote="$(echo "$tmp" | sed 's/\///g'| sed 's/\./_/g')"

    git clone "$repo" "$tmp"
    cd "$tmp"

    git filter-branch --index-filter '
        git ls-files -s |
        sed "s,\t,&'"$dir"'/," |
        GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info &&
        mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
    ' HEAD

    cd "$path"
    git remote add -f "$remote" "file://$tmp/.git"
    git pull "$remote/master"
    git merge --allow-unrelated-histories -m "Merge repo $repo into master" --edit "$remote/master"
    git remote remove "$remote"
    rm -rf "$tmp"
}

Wie zu verwenden:

cd current/package
git-add-repo https://github.com/example/example dir/to/save

Wenn man ein paar Änderungen vornimmt, kann man sogar Dateien/Verzeichnisse des zusammengeführten Repos in andere Pfade verschieben, zum Beispiel:

repo="https://github.com/example/example"
path="$(pwd)"

tmp="$(mktemp -d)"
remote="$(echo "$tmp" | sed 's/\///g' | sed 's/\./_/g')"

git clone "$repo" "$tmp"
cd "$tmp"

GIT_ADD_STORED=""

function git-mv-store
{
    from="$(echo "$1" | sed 's/\./\\./')"
    to="$(echo "$2" | sed 's/\./\\./')"

    GIT_ADD_STORED+='s,\t'"$from"',\t'"$to"',;'
}

# NOTICE! This paths used for example! Use yours instead!
git-mv-store 'public/index.php' 'public/admin.php'
git-mv-store 'public/data' 'public/x/_data'
git-mv-store 'public/.htaccess' '.htaccess'
git-mv-store 'core/config' 'config/config'
git-mv-store 'core/defines.php' 'defines/defines.php'
git-mv-store 'README.md' 'doc/README.md'
git-mv-store '.gitignore' 'unneeded/.gitignore'

git filter-branch --index-filter '
    git ls-files -s |
    sed "'"$GIT_ADD_STORED"'" |
    GIT_INDEX_FILE="$GIT_INDEX_FILE.new" git update-index --index-info &&
    mv "$GIT_INDEX_FILE.new" "$GIT_INDEX_FILE"
' HEAD

GIT_ADD_STORED=""

cd "$path"
git remote add -f "$remote" "file://$tmp/.git"
git pull "$remote/master"
git merge --allow-unrelated-histories -m "Merge repo $repo into master" --edit "$remote/master"
git remote remove "$remote"
rm -rf "$tmp"

Notizen
Pfade ersetzt über sed Stellen Sie also sicher, dass sie nach dem Zusammenführen in die richtigen Pfade verschoben werden.
El --allow-unrelated-histories gibt es erst seit git >= 2.9.

2voto

urxvtcd Punkte 55

Zusätzlich zu allen Antworten mit remote add -> fetch -> merge Strategie: Wenn Sie Tags aus dem anderen Repository beibehalten wollen, aber nicht alle in einen gemeinsamen Namensraum verschütten wollen (und möglicherweise Kollisionen bekommen), sollten Sie den Fetch-Befehl ein wenig ändern:

git fetch --no-tags other_repo
git fetch --no-tags other_repo 'refs/tags/*:refs/tags/other_repo/*'

Der erste Befehl holt alle Zweige wie üblich, lässt aber die Tags aus, die an die Commits angehängt sind, der zweite Befehl lässt auch den üblichen Mechanismus zum Holen der Tags aus ( git help fetch für mehr), und holt alle Tags, die sie abbilden, aus X a other_repo/X unter Verwendung der Refspec-Funktionalität von Git.

Referenzen (Zweige, Tags) sind in Git einfach Dateien, und Sie können Verzeichnisse für die Namensgebung verwenden. Die beiden obigen Befehle behalten die Tags des ersten Repositorys unverändert bei, während die Tags des anderen Repositorys mit einem Präfix versehen werden other_repo/

Nach der Operation ist es am besten, die andere Fernbedienung zu entfernen, damit Sie nicht versehentlich die Etiketten auf normalem Weg holen und ein Chaos verursachen.

1voto

Praveen Kumar Punkte 17

Der angegebene Befehl ist die bestmögliche Lösung, die ich vorschlage.

git subtree add --prefix=MY_PROJECT git://github.com/project/my_project.git 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