Comment déplacer le référentiel git avec toutes les branches de bitbucket vers github?
334
Quelle est la meilleure façon de déplacer un référentiel git avec toutes les branches et l'historique complet de bitbucket vers github? Existe-t-il un script ou une liste de commandes que je dois utiliser?
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
Sauf si ... votre dépôt comprend un fichier volumineux: le problème est que l'outil d'importation échouera sans un message d'erreur clair. Seul le support GitHub pourrait diagnostiquer ce qui s'est passé.
Cette méthode a créé un problème pour moi (je ne sais pas si c'est un problème). Lorsque j'ai mis en miroir le dépôt de bitbucket vers github, pour 5 branches, il est affiché comme "Compare and Pull Request" dans github. Elle n'est pas représentée sous forme de branches dans github. Que puis-je faire à ce sujet?
Cela fonctionne si vous souhaitez également déplacer un référentiel de Github vers Bitbucket.
simeg
1
J'avais besoin d'utiliser la méthode this pour copier un dépôt car il contenait un gros fichier (> 100 Mo). GH n'autoriserait pas les fichiers volumineux dans leurs dépôts. J'ai supprimé le gros fichier avant de pousser le dépôt sur GH. Cependant, sauf autres problèmes, l'utilisation de la fonction « Importer le référentiel » de GH est le bon choix 95% du temps, comme décrit dans une autre réponse . Cependant, s'il échoue, il ne donne pas de messages d'erreur utiles et vous devez contacter le support GH. C'est le support GH qui m'a informé de la restriction de taille de fichier.
LS
412
C'est très simple.
1º Créez un nouveau référentiel vide dans GitHub (sans readme ni licesne, vous pouvez les ajouter avant) et l'écran suivant affichera
2º À l'intérieur pour importer l' option de code , vous collez le dépôt de votre URL bitbucket et voilà !!
Vous répondez vraiment à la question ici, car la réponse acceptée ne montre qu'une méthode générique liée à Git. Votre réponse est bien plus simple!
Emile Bergeron
6
Cette réponse est bonne tant que vous êtes celui qui crée le référentiel et qu'il est nu. Si quelqu'un d'autre a créé le référentiel pour vous (comme le responsable administratif de la création de branche), cela ne fonctionne pas. La réponse acceptée est la voie à suivre dans un tel cas.
Master.Aurora
4
Attention à quiconque envisage d'utiliser cette méthode, supprimez votre authentification à deux facteurs sur votre hôte de référentiel précédent avant d'utiliser ce service, sinon vous serez coincé dans une boucle sans fin d'essayer de supprimer le référentiel nouvellement créé dans GitHub, et la seule façon de s'en sortir est de remplacer le /importà la fin de l'URL par /settingspour accéder aux paramètres et le supprimer.
Dave
1
Petite mise en garde - si vous rencontrez un problème, vous n'obtiendrez pas de message d'erreur descriptif.
RobertH
Utiliser la fonction « Importer le référentiel » de GH est le bon choix 95% du temps. Cependant, s'il échoue, il ne donne pas de messages d'erreur utiles et vous devez contacter le support GH. Je ne pouvais pas l'utiliser pour un seul dépôt car il contenait un gros fichier (> 100 Mo). J'avais besoin d'utiliser la méthode CLI acceptée , en supprimant le gros fichier juste avant de pousser le référentiel vers GH.
LS
125
Si vous ne trouvez pas le bouton "Importer le code" sur github, vous pouvez:
ouvrez directement Github Importer et entrez le url. Cela ressemblera à:
donnez-lui un nom (ou il importera le nom automatiquement)
Cela m'a aidé à passer d'un fournisseur de git à un autre. À la fin de celui-ci, tous les commits étaient dans le git de destination. Simple et direct.
Veuillez inclure les parties pertinentes d'un lien dans votre réponse, car il devrait être autonome.
k0pernikus
J'obtiens une erreur qui dit "Erreur: échec de la transmission de certaines références à l' indice " url.gi ": les mises à jour ont été rejetées car la télécommande contient du travail que vous n'avez pas localement. Cela est généralement dû à un autre référentiel poussant vers la même référence. Vous voudrez peut-être d'abord intégrer les modifications à distance (par exemple tirer ...) avant de pousser à nouveau. Voir la note sur les avances rapides dans git push - aide pour plus de détails.
Conteneur codé
1
c'est la seule réponse qui fonctionne encore le 03/03/2019 :)
Wang-Zhao-Liu QM
13
J'ai eu le cas d'utilisation inverse de l'importation d'un référentiel existant de github vers bitbucket.
Bitbucket propose un outil d'importation . La seule étape nécessaire consiste à ajouter une URL au référentiel.
Je me rends compte que c'est une vieille question. Je l'ai trouvé il y a plusieurs mois lorsque j'essayais de faire la même chose et j'ai été déçu par les réponses données. Ils semblaient tous gérer l'importation de Bitbucket vers GitHub un référentiel à la fois, soit via des commandes émises à la carte, soit via l'importateur GitHub.
J'ai récupéré le code d'un projet GitHub appelé gitter et l' ai modifié pour répondre à mes besoins.
Vous pouvez bifurquer l' essentiel , ou prendre le code d'ici:
#!/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
Ensuite, pour utiliser le script:
# 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
Il y a l' importation d'un référentiel avec GitHub Importer
Si vous avez un projet hébergé sur un autre système de contrôle de version comme Mercurial, vous pouvez l'importer automatiquement dans GitHub à l'aide de l'outil GitHub Importer.
Dans le coin supérieur droit de n'importe quelle page, cliquez sur, puis sur Importer le référentiel.
Sous "URL de votre ancien clone de référentiel", saisissez l'URL du projet que vous souhaitez importer.
Choisissez votre compte d'utilisateur ou une organisation pour posséder le référentiel, puis saisissez un nom pour le référentiel sur GitHub.
Spécifiez si le nouveau référentiel doit être public ou privé.
Les référentiels publics sont visibles par tous les utilisateurs de GitHub, vous pouvez donc bénéficier de la communauté collaborative de GitHub.
Boutons radio du référentiel public ou privé Les référentiels privés ne sont disponibles que pour le propriétaire du référentiel, ainsi que pour tous les collaborateurs avec lesquels vous choisissez de partager.
Vérifiez les informations que vous avez entrées, puis cliquez sur Commencer l'importation.
Vous recevrez un e-mail lorsque le référentiel aura été complètement importé.
Donne l'avantage que vous pouvez maintenant obtenir votre nouveau git-repository de github dans un autre dossier afin que vous ayez deux dossiers locaux pointant tous les deux vers des télécommandes différentes, le précédent (bitbucket) et le nouveau tous deux disponibles.
Script intéressant, combiné avec un jeton. Soigné. A voté.
VonC
@VonC Merci!
Cenk
1
Voici les étapes pour déplacer un référentiel Git privé:
Étape 1: créer un référentiel Github
Créez d'abord un nouveau référentiel privé sur Github.com. Il est important de garder le référentiel vide, par exemple ne pas cocher l'option Initialiser ce référentiel avec un fichier README lors de la création du référentiel.
Étape 2: déplacer le contenu existant
Ensuite, nous devons remplir le référentiel Github avec le contenu de notre référentiel Bitbucket:
Enfin, nous devons nous assurer que les développeurs ne se trompent pas en ayant deux référentiels pour le même projet. Voici comment supprimer le référentiel Bitbucket:
Vérifiez que le référentiel Github a tout le contenu
Accédez à l'interface Web de l'ancien référentiel Bitbucket
Sélectionnez l'option de menu Paramètres> Supprimer le référentiel
Ajoutez l'URL du nouveau référentiel Github comme URL de redirection
Avec cela, le référentiel s'est complètement installé dans sa nouvelle maison à Github. Faites le savoir à tous les développeurs!
Réponses:
Vous pouvez vous référer à la page GitHub " Dupliquer un référentiel "
Il utilise:
git clone --mirror
: pour cloner toutes les références (commits, tags, branches)git push --mirror
: pour tout pousserCela donnerait:
Comme noté dans les commentaires de LS :
Import Code
fonctionnalité de GitHub décrite par MarMass .Voir https://github.com/new/import
la source
C'est très simple.
1º Créez un nouveau référentiel vide dans GitHub (sans readme ni licesne, vous pouvez les ajouter avant) et l'écran suivant affichera
2º À l'intérieur pour importer l' option de code , vous collez le dépôt de votre URL bitbucket et voilà !!
la source
/import
à la fin de l'URL par/settings
pour accéder aux paramètres et le supprimer.Si vous ne trouvez pas le bouton "Importer le code" sur github, vous pouvez:
url
. Cela ressemblera à:Public
ouPrivate
repoBegin Import
MISE À JOUR: Récemment, Github a annoncé la possibilité d '« importer des référentiels avec des fichiers volumineux »
la source
http://www.blackdogfoundry.com/blog/moving-repository-from-bitbucket-to-github/
Cela m'a aidé à passer d'un fournisseur de git à un autre. À la fin de celui-ci, tous les commits étaient dans le git de destination. Simple et direct.
la source
J'ai eu le cas d'utilisation inverse de l'importation d'un référentiel existant de github vers bitbucket.
Bitbucket propose un outil d'importation . La seule étape nécessaire consiste à ajouter une URL au référentiel.
On dirait:
la source
Je me rends compte que c'est une vieille question. Je l'ai trouvé il y a plusieurs mois lorsque j'essayais de faire la même chose et j'ai été déçu par les réponses données. Ils semblaient tous gérer l'importation de Bitbucket vers GitHub un référentiel à la fois, soit via des commandes émises à la carte, soit via l'importateur GitHub.
J'ai récupéré le code d'un projet GitHub appelé gitter et l' ai modifié pour répondre à mes besoins.
Vous pouvez bifurquer l' essentiel , ou prendre le code d'ici:
Ensuite, pour utiliser le script:
la source
Il y a l' importation d'un référentiel avec GitHub Importer
Si vous avez un projet hébergé sur un autre système de contrôle de version comme Mercurial, vous pouvez l'importer automatiquement dans GitHub à l'aide de l'outil GitHub Importer.
Vous recevrez un e-mail lorsque le référentiel aura été complètement importé.
la source
Si vous souhaitez déplacer votre référentiel git local vers un autre en amont, vous pouvez également le faire:
pour obtenir l'url distante actuelle:
affichera quelque chose comme: https://bitbucket.com/git/myrepo
pour définir un nouveau référentiel distant:
maintenant pousser le contenu de la branche actuelle (développer):
Vous avez maintenant une copie complète de la branche dans la nouvelle télécommande.
éventuellement revenir à git-remote d'origine pour ce dossier local:
Donne l'avantage que vous pouvez maintenant obtenir votre nouveau git-repository de github dans un autre dossier afin que vous ayez deux dossiers locaux pointant tous les deux vers des télécommandes différentes, le précédent (bitbucket) et le nouveau tous deux disponibles.
la source
J'ai créé le script bash suivant afin de cloner TOUS mes référentiels Bitbucket (utilisateur) vers GitHub en tant que référentiels privés .
Exigences:
brew install jq
Pas:
Accédez à https://github.com/settings/tokens et créez un jeton d'accès. Nous avons seulement besoin de la portée "repo".
Enregistrez le
move_me.sh
script dans un dossier de travail et modifiez le fichier selon vos besoins.N'oubliez pas
CHMOD 755
Courir!
./move_me.sh
Profitez du temps que vous avez économisé.
Remarques:
Il clonera les référentiels BitBucket dans le répertoire où réside le script (votre répertoire de travail.)
Ce script ne supprime pas vos référentiels BitBucket.
Besoin de passer aux référentiels publics sur GitHub?
Trouvez et changer
"private": true
à"private": false
ci - dessous.Déplacer les référentiels d'une organisation?
Consultez le guide du développeur , c'est à quelques modifications.
Bon déménagement.
la source
Voici les étapes pour déplacer un référentiel Git privé:
Étape 1: créer un référentiel Github
Créez d'abord un nouveau référentiel privé sur Github.com. Il est important de garder le référentiel vide, par exemple ne pas cocher l'option Initialiser ce référentiel avec un fichier README lors de la création du référentiel.
Étape 2: déplacer le contenu existant
Ensuite, nous devons remplir le référentiel Github avec le contenu de notre référentiel Bitbucket:
Étape 3: nettoyer l'ancien référentiel
Enfin, nous devons nous assurer que les développeurs ne se trompent pas en ayant deux référentiels pour le même projet. Voici comment supprimer le référentiel Bitbucket:
Vérifiez que le référentiel Github a tout le contenu
Accédez à l'interface Web de l'ancien référentiel Bitbucket
Sélectionnez l'option de menu Paramètres> Supprimer le référentiel
Ajoutez l'URL du nouveau référentiel Github comme URL de redirection
Avec cela, le référentiel s'est complètement installé dans sa nouvelle maison à Github. Faites le savoir à tous les développeurs!
la source
Le moyen le plus simple de le faire:
Une fois le push vers GitHub réussi, supprimez l'ancienne télécommande en exécutant:
la source