Wie verschiebe ich das Git-Repository mit allen Zweigen von Bitbucket nach Github?
334
Was ist der beste Weg, um ein Git-Repository mit allen Zweigen und der vollständigen Historie von Bitbucket auf Github zu verschieben? Gibt es ein Skript oder eine Liste von Befehlen, die ich verwenden muss?
git clone --mirror https://bitbucket.org/exampleuser/repository-to-mirror.git
# Make a bare mirrored clone of the repository
cd repository-to-mirror.git
git remote set-url --push origin https://github.com/exampleuser/mirrored
# Set the push location to your mirror
git push --mirror
Es sei denn ... Ihr Repo enthält eine große Datei: Das Problem ist, dass das Import-Tool ohne eine eindeutige Fehlermeldung fehlschlägt. Nur der GitHub-Support kann diagnostizieren, was passiert ist.
Diese Methode hat ein Problem für mich verursacht (nicht sicher, ob es ein Problem ist). Wenn ich das Repo von Bitbucket zu Github gespiegelt habe, wird es für 5 Zweige in Github als "Compare and Pull Request" angezeigt. Es wird nicht als Zweig in Github angezeigt. Was kann ich tun?
Dies funktioniert, wenn Sie ein Repository auch von Github nach Bitbucket verschieben möchten.
Simeg
1
Ich musste diese Methode verwenden, um ein Repo zu kopieren, da es eine große Datei (> 100 MB) enthielt. GH würde keine großen Dateien in ihren Repos zulassen. Ich habe die große Datei entfernt, bevor ich das Repo an GH gesendet habe. Abgesehen von anderen Problemen ist die Verwendung der Funktion " Repository importieren" von GH in 95% der Fälle die richtige Wahl , wie in einer anderen Antwort beschrieben . Wenn dies jedoch fehlschlägt, werden keine hilfreichen Fehlermeldungen angezeigt, und Sie müssen sich an den GH-Support wenden. Es war der GH-Support, der mich über die Einschränkung der Dateigröße informierte.
LS
411
Es ist sehr einfach.
1º Erstellen Sie ein neues leeres Repository in GitHub (ohne Readme oder Licesne können Sie diese vorher hinzufügen) und der folgende Bildschirm wird angezeigt
2º Um die Code- Option zu importieren , fügen Sie das Repo und die Voilà Ihrer Bitbucket-URL ein !!
Sie beantworten die Frage hier wirklich, da die akzeptierte Antwort nur eine generische Git-bezogene Methode zeigt. Ihre Antwort ist viel einfacher!
Emile Bergeron
6
Diese Antwort ist gut, solange Sie das Repository erstellen und es ist nackt. Wenn jemand anderes das Repository für Sie erstellt hat (wie der Administrator für die Erstellung von Zweigen), funktioniert dies nicht. Akzeptierte Antwort ist in einem solchen Fall der richtige Weg.
Master.Aurora
4
Wenn Sie über diese Methode nachdenken möchten, entfernen Sie Ihre Zwei-Faktor-Authentifizierung auf Ihrem vorherigen Repository-Host, bevor Sie diesen Dienst verwenden. Andernfalls stecken Sie in einer Endlosschleife beim Versuch, das neu erstellte Repository in GitHub zu entfernen Der einzige Weg, um daraus herauszukommen, besteht darin, die /importam Ende der URL zu ersetzen, um auf /settingsdie Einstellungen zuzugreifen und sie zu entfernen.
Dave
1
Kleine Einschränkung - Wenn Sie auf ein Problem stoßen, wird keine beschreibende Fehlermeldung angezeigt.
RobertH
In 95% der Fälle ist die Verwendung der GH-Funktion " Repository importieren " die richtige Wahl . Wenn dies jedoch fehlschlägt, werden keine hilfreichen Fehlermeldungen angezeigt, und Sie müssen sich an den GH-Support wenden. Ich konnte es nicht für ein Repo verwenden, da es eine große Datei (> 100 MB) enthielt. Ich musste die akzeptierte CLI-Methode verwenden und die große Datei entfernen, bevor ich das Repo an GH weiterleitete.
LS
125
Falls Sie die Schaltfläche "Code importieren" auf github nicht finden konnten, können Sie:
Öffnen Sie direkt den Github Importer und geben Sie den einurl . Es wird so aussehen:
Gib ihm einen Namen (oder er importiert den Namen automatisch)
Leider hat dies bei meinem Versuch, von codebasehq zu git-hub zu wechseln, nicht funktioniert. Es wurde die Meldung "Diese URL wird nicht unterstützt" angezeigt. :(
sjmcdowall
@sjmcdowall Entschuldigung, aber ich glaube, es hätte funktionieren sollen, da die Codebasehq-URL auf ein Git-Repository verweist.
Biniam
URL existiert nicht mehr.
Codierter Container
@CodedContainer Ich habe gerade überprüft und es funktioniert. Ich habe gerade den Screenshot aktualisiert.
Biniam
1
Die URL gibt nur dann einen 404 zurück, wenn Sie nicht bei GitHub angemeldet sind. Wenn Sie angemeldet sind, wird das Import-Tool geladen.
Bitte fügen Sie die relevanten Teile eines Links in Ihre Antwort ein, da dieser für sich allein stehen sollte.
k0pernikus
Ich erhalte die Fehlermeldung "Fehler: Einige Refs konnten nicht an ' url.gi ' gesendet werden. Hinweis: Aktualisierungen wurden abgelehnt, da die Fernbedienung Arbeit enthält, die Sie nicht lokal haben. Dies wird normalerweise durch ein anderes Repository verursacht, das auf dieselbe Refs pusht . Möglicherweise möchten Sie zuerst die Remote-Änderungen (z. B. Pull ...) integrieren, bevor Sie erneut drücken. Weitere Informationen finden Sie im Hinweis zum Schnellvorlauf in git push --help.
Codierter Container
1
Dies ist die einzige Antwort, die noch am 03.03.2019 funktioniert :)
Wang-Zhao-Liu QM
13
Ich hatte den umgekehrten Anwendungsfall, ein vorhandenes Repository von Github in Bitbucket zu importieren.
Bitbucket bietet ein Import-Tool . Der einzige notwendige Schritt ist das Hinzufügen einer URL zum Repository.
Mir ist klar, dass dies eine alte Frage ist. Ich fand es vor einigen Monaten, als ich versuchte, dasselbe zu tun, und war von den gegebenen Antworten überwältigt. Sie alle schienen sich mit dem Import von Bitbucket in GitHub nacheinander zu befassen, entweder über Befehle à la carte oder über den GitHub-Importer.
Ich grabulated den Code aus einem GitHub Projekt namens gitter und an meine Bedürfnisse angepasst.
#!/usr/bin/env ruby
require 'fileutils'
# Originally -- Dave Deriso -- [email protected]
# Contributor -- G. Richard Bellamy -- [email protected]
# If you contribute, put your name here!
# To get your team ID:
# 1. Go to your GitHub profile, select 'Personal Access Tokens', and create an Access token
# 2. curl -H "Authorization: token <very-long-access-token>" https://api.github.com/orgs/<org-name>/teams
# 3. Find the team name, and grabulate the Team ID
# 4. PROFIT!
#----------------------------------------------------------------------
#your particulars
@access_token = ''
@team_id = ''
@org = ''
#----------------------------------------------------------------------
#the verison of this app
@version = "0.2"
#----------------------------------------------------------------------
#some global params
@create = false
@add = false
@migrate = false
@debug = false
@done = false
@error = false
#----------------------------------------------------------------------
#fancy schmancy color scheme
class String; def c(cc); "\e[#{cc}m#{self}\e[0m" end end
#200.to_i.times{ |i| print i.to_s.c(i) + " " }; puts
@sep = "-".c(90)*95
@sep_pref = ".".c(90)*95
@sep_thick = "+".c(90)*95
#----------------------------------------------------------------------
# greetings
def hello
puts @sep
puts "BitBucket to GitHub migrator -- v.#{@version}".c(95)
#puts @sep_thick
end
def goodbye
puts @sep
puts "done!".c(95)
puts @sep
exit
end
def puts_title(text)
puts @sep, "#{text}".c(36), @sep
end
#----------------------------------------------------------------------
# helper methods
def get_options
require 'optparse'
n_options = 0
show_options = false
OptionParser.new do |opts|
opts.banner = @sep +"\nUsage: gitter [options]\n".c(36)
opts.version = @version
opts.on('-n', '--name [name]', String, 'Set the name of the new repo') { |value| @repo_name = value; n_options+=1 }
opts.on('-c', '--create', String, 'Create new repo') { @create = true; n_options+=1 }
opts.on('-m', '--migrate', String, 'Migrate the repo') { @migrate = true; n_options+=1 }
opts.on('-a', '--add', String, 'Add repo to team') { @add = true; n_options+=1 }
opts.on('-l', '--language [language]', String, 'Set language of the new repo') { |value| @language = value.strip.downcase; n_options+=1 }
opts.on('-d', '--debug', 'Print commands for inspection, doesn\'t actually run them') { @debug = true; n_options+=1 }
opts.on_tail('-h', '--help', 'Prints this little guide') { show_options = true; n_options+=1 }
@opts = opts
end.parse!
if show_options || n_options == 0
puts @opts
puts "\nExamples:".c(36)
puts 'create new repo: ' + "\t\tgitter -c -l javascript -n node_app".c(93)
puts 'migrate existing to GitHub: ' + "\tgitter -m -n node_app".c(93)
puts 'create repo and migrate to it: ' + "\tgitter -c -m -l javascript -n node_app".c(93)
puts 'create repo, migrate to it, and add it to a team: ' + "\tgitter -c -m -a -l javascript -n node_app".c(93)
puts "\nNotes:".c(36)
puts "Access Token for repo is #{@access_token} - change this on line 13"
puts "Team ID for repo is #{@team_id} - change this on line 14"
puts "Organization for repo is #{@org} - change this on line 15"
puts 'The assumption is that the person running the script has SSH access to BitBucket,'
puts 'and GitHub, and that if the current directory contains a directory with the same'
puts 'name as the repo to migrated, it will deleted and recreated, or created if it'
puts 'doesn\'t exist - the repo to migrate is mirrored locally, and then created on'
puts 'GitHub and pushed from that local clone.'
puts 'New repos are private by default'
puts "Doesn\'t like symbols for language (ex. use \'c\' instead of \'c++\')"
puts @sep
exit
end
end
#----------------------------------------------------------------------
# git helper methods
def gitter_create(repo)
if @language
%q[curl https://api.github.com/orgs/] + @org + %q[/repos -H "Authorization: token ] + @access_token + %q[" -d '{"name":"] + repo + %q[","private":true,"language":"] + @language + %q["}']
else
%q[curl https://api.github.com/orgs/] + @org + %q[/repos -H "Authorization: token ] + @access_token + %q[" -d '{"name":"] + repo + %q[","private":true}']
end
end
def gitter_add(repo)
if @language
%q[curl https://api.github.com/teams/] + @team_id + %q[/repos/] + @org + %q[/] + repo + %q[ -H "Accept: application/vnd.github.v3+json" -H "Authorization: token ] + @access_token + %q[" -d '{"permission":"pull","language":"] + @language + %q["}']
else
%q[curl https://api.github.com/teams/] + @team_id + %q[/repos/] + @org + %q[/] + repo + %q[ -H "Accept: application/vnd.github.v3+json" -H "Authorization: token ] + @access_token + %q[" -d '{"permission":"pull"}']
end
end
def git_clone_mirror(bitbucket_origin, path)
"git clone --mirror #{bitbucket_origin}"
end
def git_push_mirror(github_origin, path)
"(cd './#{path}' && git push --mirror #{github_origin} && cd ..)"
end
def show_pwd
if @debug
Dir.getwd()
end
end
def git_list_origin(path)
"(cd './#{path}' && git config remote.origin.url && cd ..)"
end
# error checks
def has_repo
File.exist?('.git')
end
def has_repo_or_error(show_error)
@repo_exists = has_repo
if !@repo_exists
puts 'Error: no .git folder in current directory'.c(91) if show_error
@error = true
end
"has repo: #{@repo_exists}"
end
def has_repo_name_or_error(show_error)
@repo_name_exists = !(defined?(@repo_name)).nil?
if !@repo_name_exists
puts 'Error: repo name missing (-n your_name_here)'.c(91) if show_error
@error = true
end
end
#----------------------------------------------------------------------
# main methods
def run(commands)
if @debug
commands.each { |x| puts(x) }
else
commands.each { |x| system(x) }
end
end
def set_globals
puts_title 'Parameters'
@git_bitbucket_origin = "[email protected]:#{@org}/#{@repo_name}.git"
@git_github_origin = "[email protected]:#{@org}/#{@repo_name}.git"
puts 'debug: ' + @debug.to_s.c(93)
puts 'working in: ' + Dir.pwd.c(93)
puts 'create: ' + @create.to_s.c(93)
puts 'migrate: ' + @migrate.to_s.c(93)
puts 'add: ' + @add.to_s.c(93)
puts 'language: ' + @language.to_s.c(93)
puts 'repo name: '+ @repo_name.to_s.c(93)
puts 'bitbucket: ' + @git_bitbucket_origin.to_s.c(93)
puts 'github: ' + @git_github_origin.to_s.c(93)
puts 'team_id: ' + @team_id.to_s.c(93)
puts 'org: ' + @org.to_s.c(93)
end
def create_repo
puts_title 'Creating'
#error checks
has_repo_name_or_error(true)
goodbye if @error
puts @sep
commands = [
gitter_create(@repo_name)
]
run commands
end
def add_repo
puts_title 'Adding repo to team'
#error checks
has_repo_name_or_error(true)
goodbye if @error
puts @sep
commands = [
gitter_add(@repo_name)
]
run commands
end
def migrate_repo
puts_title "Migrating Repo to #{@repo_provider}"
#error checks
has_repo_name_or_error(true)
goodbye if @error
if Dir.exists?("#{@repo_name}.git")
puts "#{@repo_name} already exists... recursively deleting."
FileUtils.rm_r("#{@repo_name}.git")
end
path = "#{@repo_name}.git"
commands = [
git_clone_mirror(@git_bitbucket_origin, path),
git_list_origin(path),
git_push_mirror(@git_github_origin, path)
]
run commands
end
#----------------------------------------------------------------------
#sequence control
hello
get_options
#do stuff
set_globals
create_repo if @create
migrate_repo if @migrate
add_repo if @add
#peace out
goodbye
So verwenden Sie das Skript:
# create a list of repos
foo
bar
baz
# execute the script, iterating over your list
while read p; do ./bitbucket-to-github.rb -a -n $p; done<repos
# good nuff
Es gibt das Importieren eines Repositorys mit GitHub Importer
Wenn Sie ein Projekt auf einem anderen Versionskontrollsystem als Mercurial gehostet haben, können Sie es mit dem GitHub Importer-Tool automatisch in GitHub importieren.
Klicken Sie in der oberen rechten Ecke einer Seite auf und dann auf Repository importieren.
Geben Sie unter "Klon-URL Ihres alten Repositorys" die URL des Projekts ein, das Sie importieren möchten.
Wählen Sie Ihr Benutzerkonto oder eine Organisation aus, der das Repository gehören soll, und geben Sie dann einen Namen für das Repository auf GitHub ein.
Geben Sie an, ob das neue Repository öffentlich oder privat sein soll.
Öffentliche Repositorys sind für jeden Benutzer auf GitHub sichtbar, sodass Sie von der kollaborativen Community von GitHub profitieren können.
Optionsfelder für öffentliche oder private Repositorys Private Repositorys stehen nur dem Repository-Eigentümer sowie allen Mitarbeitern zur Verfügung, die Sie freigeben möchten.
Überprüfen Sie die eingegebenen Informationen und klicken Sie dann auf Import starten.
Sie erhalten eine E-Mail, wenn das Repository vollständig importiert wurde.
Bietet den Vorteil, dass Sie Ihr neues Git-Repository jetzt von github in einem anderen Ordner herunterladen können, sodass zwei lokale Ordner auf die verschiedenen Fernbedienungen verweisen, die vorherige (Bitbucket) und die neue, beide verfügbar.
Interessantes Skript, kombiniert mit einem Token. Ordentlich. Upvoted.
VonC
@VonC Danke!
Cenk
1
Hier sind die Schritte zum Verschieben eines privaten Git-Repositorys:
Schritt 1: Erstellen Sie ein Github-Repository
Erstellen Sie zunächst ein neues privates Repository auf Github.com. Es ist wichtig, das Repository leer zu halten, z. B. nicht die Option Dieses Repository beim Erstellen des Repositorys mit einer README-Datei initialisieren.
Schritt 2: Verschieben Sie vorhandene Inhalte
Als nächstes müssen wir das Github-Repository mit dem Inhalt aus unserem Bitbucket-Repository füllen:
Überprüfen Sie das vorhandene Repository von Bitbucket:
Schließlich müssen wir sicherstellen, dass Entwickler nicht durch zwei Repositorys für dasselbe Projekt verwirrt werden. So löschen Sie das Bitbucket-Repository:
Stellen Sie sicher, dass das Github-Repository den gesamten Inhalt enthält
Gehen Sie zur Weboberfläche des alten Bitbucket-Repositorys
Wählen Sie die Menüoption Einstellung> Repository löschen
Fügen Sie die URL des neuen Github-Repositorys als Umleitungs-URL hinzu
Damit hat sich das Endlager vollständig in seinem neuen Zuhause in Github niedergelassen. Lassen Sie alle Entwickler wissen!
Antworten:
Sie können auf die GitHub-Seite " Duplizieren eines Repositorys " verweisen "
Es verwendet:
git clone --mirror
: um alle Referenzen (Commits, Tags, Zweige) zu klonengit push --mirror
: alles schiebenDas würde geben:
Wie in den Kommentaren von LS erwähnt :
Import Code
Funktion von GitHub zu verwenden .Siehe https://github.com/new/import
quelle
Es ist sehr einfach.
1º Erstellen Sie ein neues leeres Repository in GitHub (ohne Readme oder Licesne können Sie diese vorher hinzufügen) und der folgende Bildschirm wird angezeigt
2º Um die Code- Option zu importieren , fügen Sie das Repo und die Voilà Ihrer Bitbucket-URL ein !!
quelle
/import
am Ende der URL zu ersetzen, um auf/settings
die Einstellungen zuzugreifen und sie zu entfernen.Falls Sie die Schaltfläche "Code importieren" auf github nicht finden konnten, können Sie:
url
. Es wird so aussehen:Public
oderPrivate
repoBegin Import
UPDATE: Vor kurzem hat Github die Möglichkeit angekündigt, " Repositorys mit großen Dateien zu importieren ".
quelle
http://www.blackdogfoundry.com/blog/moving-repository-from-bitbucket-to-github/
Dies hat mir geholfen, von einem Git-Anbieter zu einem anderen zu wechseln. Am Ende befanden sich alle Commits im Ziel-Git. Einfach und unkompliziert.
quelle
Ich hatte den umgekehrten Anwendungsfall, ein vorhandenes Repository von Github in Bitbucket zu importieren.
Bitbucket bietet ein Import-Tool . Der einzige notwendige Schritt ist das Hinzufügen einer URL zum Repository.
Es sieht aus wie:
quelle
Mir ist klar, dass dies eine alte Frage ist. Ich fand es vor einigen Monaten, als ich versuchte, dasselbe zu tun, und war von den gegebenen Antworten überwältigt. Sie alle schienen sich mit dem Import von Bitbucket in GitHub nacheinander zu befassen, entweder über Befehle à la carte oder über den GitHub-Importer.
Ich grabulated den Code aus einem GitHub Projekt namens gitter und an meine Bedürfnisse angepasst.
Sie können das Wesentliche teilen oder den Code von hier übernehmen:
So verwenden Sie das Skript:
quelle
Es gibt das Importieren eines Repositorys mit GitHub Importer
Wenn Sie ein Projekt auf einem anderen Versionskontrollsystem als Mercurial gehostet haben, können Sie es mit dem GitHub Importer-Tool automatisch in GitHub importieren.
Sie erhalten eine E-Mail, wenn das Repository vollständig importiert wurde.
quelle
Wenn Sie Ihr lokales Git-Repository in ein anderes Upstream verschieben möchten, können Sie dies auch tun:
So erhalten Sie die aktuelle Remote-URL:
zeigt etwas wie: https://bitbucket.com/git/myrepo
So legen Sie ein neues Remote-Repository fest:
Drücken Sie jetzt den Inhalt des aktuellen (Entwicklungs-) Zweigs:
Sie haben jetzt eine vollständige Kopie des Zweigs in der neuen Fernbedienung.
Optional kehren Sie für diesen lokalen Ordner zur ursprünglichen Git-Remote zurück:
Bietet den Vorteil, dass Sie Ihr neues Git-Repository jetzt von github in einem anderen Ordner herunterladen können, sodass zwei lokale Ordner auf die verschiedenen Fernbedienungen verweisen, die vorherige (Bitbucket) und die neue, beide verfügbar.
quelle
Ich habe das folgende Bash-Skript erstellt, um ALLE meine Bitbucket (Benutzer) -Repositorys als private Repositorys auf GitHub zu klonen .
Bedarf:
brew install jq
Schritte:
Gehen Sie zu https://github.com/settings/tokens und erstellen Sie ein Zugriffstoken. Wir brauchen nur den "Repo" -Bereich.
Speichern Sie das
move_me.sh
Skript in einem Arbeitsordner und bearbeiten Sie die Datei nach Bedarf.Vergiss es nicht
CHMOD 755
Lauf!
./move_me.sh
Genießen Sie die Zeit, die Sie gespart haben.
Anmerkungen:
Es klont die BitBucket-Repositorys in das Verzeichnis, in dem sich das Skript befindet (Ihr Arbeitsverzeichnis).
Dieses Skript löscht Ihre BitBucket-Repositorys nicht.
Müssen Sie in öffentliche Repositories auf GitHub wechseln?
Suchen und ändern Sie die
"private": true
zu"private": false
unten.Verschieben der Repositorys einer Organisation?
Schauen Sie sich das Entwicklerhandbuch an , es ist ein paar Änderungen entfernt.
Viel Spaß beim Umzug.
quelle
Hier sind die Schritte zum Verschieben eines privaten Git-Repositorys:
Schritt 1: Erstellen Sie ein Github-Repository
Erstellen Sie zunächst ein neues privates Repository auf Github.com. Es ist wichtig, das Repository leer zu halten, z. B. nicht die Option Dieses Repository beim Erstellen des Repositorys mit einer README-Datei initialisieren.
Schritt 2: Verschieben Sie vorhandene Inhalte
Als nächstes müssen wir das Github-Repository mit dem Inhalt aus unserem Bitbucket-Repository füllen:
Schritt 3: Bereinigen Sie das alte Repository
Schließlich müssen wir sicherstellen, dass Entwickler nicht durch zwei Repositorys für dasselbe Projekt verwirrt werden. So löschen Sie das Bitbucket-Repository:
Stellen Sie sicher, dass das Github-Repository den gesamten Inhalt enthält
Gehen Sie zur Weboberfläche des alten Bitbucket-Repositorys
Wählen Sie die Menüoption Einstellung> Repository löschen
Fügen Sie die URL des neuen Github-Repositorys als Umleitungs-URL hinzu
Damit hat sich das Endlager vollständig in seinem neuen Zuhause in Github niedergelassen. Lassen Sie alle Entwickler wissen!
quelle
Einfachste Art und Weise:
Wenn der Push zu GitHub erfolgreich ist, löschen Sie die alte Fernbedienung, indem Sie Folgendes ausführen:
quelle