题 如何将所有分支从bitbucket移动到github?


将所有分支和完整历史从bitbucket移动到github的git存储库的最佳方法是什么?是否有脚本或命令列表我必须使用?


289
2018-04-07 08:12


起源


Github为此提供工具和文档: help.github.com/articles/...  help.github.com/articles/... - mems


答案:


你可以参考GitHub页面“复制存储库

它用:

这会给:

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

如注意到 在评论中s by L S.


337
2018-04-07 08:25



这个方法给我带来了一个问题(不确定它是否有问题)。当我将来自bitbucket的repo镜像到github然后为5个分支时,它在github中显示为“Compare and Pull Request”。它没有在github中显示为分支。我该怎么办? - Siddharth
然后问题和维基呢? - Vladislav Rastrusny
@FractalizeR wiki只是另一个回购,你也可以复制(github.com/blog/699-making-github-more-open-git-backed-wikis)。但是,没有简单的方法可以复制问题。你需要使用Api(各种GitHub repo备份程序就是这样做的: addyosmani.com/blog/backing-up-a-github-account) - VonC
@Siddharth我想你正在寻找这个答案: stackoverflow.com/questions/13321516/... 我最初也想知道同样的问题。 - Jai Pandya
如果您想将存储库从Github移动到Bitbucket,这也适用。 - simeg


这很简单。

 在GitHub中创建一个新的空存储库(没有自述文件或licesne,您可以在之前添加它们),以下屏幕将显示

 里面到 导入代码 选项你粘贴你的bitbucket URL的repo和voilà!!

Click in import code


393
2017-11-02 18:09



你真的回答了这个问题,因为接受的答案只显示了一个通用的Git相关方法。你的答案更简单! - Emile Bergeron
只要您是创建存储库的人并且它是裸露的,这个答案就很好。如果其他人已经为您创建了存储库(比如创建分支的管理员),那么这不起作用。在这种情况下,接受的答案是可行的方法。 - Master.Aurora
对于其他想要使用此方法的人,请在使用此服务之前删除先前存储库主机上的双因素身份验证,否则您将陷入无休止的循环,尝试在GitHub中删除新创建的存储库,并且摆脱这种情况的唯一方法就是取而代之 /import 在URL的末尾 /settings 访问设置并将其删除。 - Dave
小警告 - 如果遇到问题,您将不会收到描述性错误消息。 - RobertH
使用GH的“导入存储库“功能是正确的选择 95%的时间。但是,如果失败,则不会提供有用的错误消息,您必须联系GH支持。我无法将它用于一个仓库,因为它包含一个大文件(> 100MB)。我需要使用 接受CLI方法,在将回购推送到GH之前删除大文件。 - L S


如果您在github上找不到“导入代码”按钮,您可以:

  1. 直接打开 Github进口商 然后进入 url。它看起来像: Screenshot of github importer
  2. 给它一个名字(或者它会自动导入名字)
  3. 选择 Public 要么 Private 回购
  4. 点击 Begin Import

更新: 最近,Github宣布了“能力”导入包含大文件的存储库


119
2017-11-24 05:09



不幸的是,这对我从codebasehq迁移到git-hub的尝试不起作用,给出了“不支持此URL”。 :( - sjmcdowall
@sjmcdowall很抱歉它没有,但我相信它应该有效,因为codebasehq URL指向git存储库。 - biniam_Ethiopia
网址不再存在。 - Coded Container
@CodedContainer我刚检查过它的确有效。我甚至刚刚更新了屏幕截图。 - biniam_Ethiopia
如果您未登录GitHub,则URL将仅返回404。如果您已登录,则会加载导入工具。 - Jason Hurt


http://www.blackdogfoundry.com/blog/moving-repository-from-bitbucket-to-github/

这帮助我从一个git提供者转移到另一个。最后,所有提交都在目标git中。简单直接。

git remote rename origin bitbucket
git remote add origin https://github.com/edwardaux/Pipelines.git
git push origin master

一旦我很高兴推动GitHub成功,我就可以   通过发出以下命令删除旧遥控器

git remote rm bitbucket

32
2017-09-18 04:15



请在答案中包含链接的相关部分,因为它应该能够独立存在。 - k0pernikus
我收到一条错误,上面写着“错误:无法将som refs推到'url.gi”;提示:更新被拒绝,因为遥控器包含您本地没有的工作。这通常是由另一个存储库推送到同一个ref引起的。您可能希望在再次按下之前首先集成远程更改(例如,拉动...)。有关详细信息,请参阅git push --help中有关快进的说明。 - Coded Container


我有从github导入现有存储库到bitbucket的反向用例。

Bitbucket提供 导入工具 同样。唯一必要的步骤是将URL添加到存储库。

看起来像:

Screenshot of the bitbucket import tool


12
2018-02-16 11:24





我意识到这是一个老问题。几个月前,当我试图做同样的事情时,我发现了它,并且给出的答案不知所措。他们似乎都在处理从Bitbucket一次导入GitHub的一个存储库,无论是通过单点发出的命令,还是通过GitHub导入器。

我从一个名为GitHub的项目中获取了代码 小胶质 并修改它以满足我的需求。

你可以分叉 要旨,或从这里获取代码:

#!/usr/bin/env ruby
require 'fileutils'

# Originally  -- Dave Deriso        -- deriso@gmail.com
# Contributor -- G. Richard Bellamy -- rbellamy@terradatum.com
# 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 =   "git@bitbucket.org:#{@org}/#{@repo_name}.git"
  @git_github_origin = "git@github.com:#{@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

然后,使用脚本:

# 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

4
2017-11-07 06:04





使用GitHub Importer导入存储库

如果您在另一个版本控制系统上托管的项目为Mercurial,则可以使用GitHub Importer工具自动将其导入GitHub。

  1. 在任何页面的右上角,单击,然后单击“导入存储库”。
  2. 在“您的旧存储库的克隆URL”下,键入要导入的项目的URL。
  3. 选择您的用户帐户或拥有存储库的组织,然后在GitHub上键入存储库的名称。
  4. 指定新存储库是公共存储还是私有存储库。
    • 公共存储库对GitHub上的任何用户都是可见的,因此您可以从GitHub的协作社区中受益。
    • 公共或私有存储库单选按钮私有存储库仅对存储库所有者以及您选择与之共享的任何协作者可用。
  5. 查看您输入的信息,然后单击开始导入。

完全导入存储库后,您将收到一封电子邮件。

  1. https://help.github.com/categories/importing-your-projects-to-github
  2. https://help.github.com/articles/importing-a-repository-with-github-importer/

4
2017-11-24 19:10