Bagaimana cara memindahkan repositori git dengan semua cabang dari bitbucket ke github?


334

Apa cara terbaik untuk memindahkan repositori git dengan semua cabang dan riwayat lengkap dari bitbucket ke github? Apakah ada skrip atau daftar perintah yang harus saya gunakan?


9
Github menyediakan alat dan dokumentasi untuk itu: help.github.com/articles/… help.github.com/articles/…
mems

Agak terlambat ke pesta tetapi di sini ada skrip untuk migrasi: gist.github.com/chinmaya-n/cff02f1277c811deab2e550f2aad9967
inblueswithu

Jawaban:


394

Anda dapat merujuk ke halaman GitHub " Menggandakan repositori "

Ini menggunakan:

Itu akan memberi:

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

Seperti yang Tercatat dalam komentar oleh LS :


2
Metode ini menciptakan masalah bagi saya (tidak yakin apakah itu masalah). Ketika saya mirror repo dari bitbucket ke github maka untuk 5 cabang ditampilkan sebagai "Bandingkan dan Tarik Permintaan" di github. Itu tidak ditampilkan sebagai cabang di github. Apa yang bisa saya lakukan?
Siddharth

2
Lalu bagaimana dengan masalah dan wiki?
Vladislav Rastrusny

@FractalizeR wiki hanyalah repo lain, yang dapat Anda tiru juga ( github.com/blog/699-making-github-more-open-git-backed-wikis ). Tidak ada cara mudah untuk mereplikasi masalah. Anda perlu menggunakan Api (berbagai program cadangan repo GitHub melakukan hal itu: addyosmani.com/blog/backing-up-a-github-account )
VonC

3
Ini berfungsi jika Anda ingin memindahkan repositori dari Github ke Bitbucket juga.
simeg

1
Saya perlu menggunakan metode ini untuk menyalin repo karena berisi file besar (> 100MB). GH tidak akan mengizinkan file besar dalam repo mereka. Saya menghapus file besar sebelum mendorong repo ke GH. Namun, kecuali masalah lain, menggunakan fitur GH " Import repository " adalah pilihan yang tepat 95% dari waktu, seperti dijelaskan dalam jawaban lain . Namun, jika gagal, itu tidak memberikan pesan kesalahan yang membantu dan Anda harus menghubungi dukungan GH. Itu adalah dukungan GH yang memberi tahu saya tentang batasan ukuran file.
LS

412

Ini sangat sederhana.

Buat repositori kosong baru di GitHub (tanpa readme atau licesne, Anda dapat menambahkannya sebelumnya) dan layar berikut akan menunjukkan

Di dalam untuk mengimpor opsi kode, Anda menempelkan repo dan voilà URL bitbucket Anda !!

Klik dalam kode impor


12
Anda benar-benar menjawab pertanyaan di sini, karena jawaban yang diterima hanya menunjukkan metode terkait Git yang umum. Jawaban Anda lebih sederhana!
Emile Bergeron

6
Jawaban ini bagus asalkan Anda yang membuat repositori dan kosong. Jika orang lain telah membuat repositori untuk Anda (seperti inci admin pembuatan cabang) maka ini tidak berfungsi. Jawaban yang diterima adalah cara untuk pergi dalam kasus seperti itu.
Master.Aurora

4
Hadapi orang lain yang berpikir untuk menggunakan metode ini, hapus autentikasi dua faktor Anda pada host repositori sebelumnya sebelum Anda menggunakan layanan ini, jika tidak, Anda akan terjebak dalam lingkaran tanpa akhir untuk mencoba menghapus repositori yang baru dibuat di GitHub, dan satu-satunya cara untuk keluar adalah dengan mengganti /importdi bagian akhir URL dengan /settingsuntuk mengakses pengaturan dan menghapusnya.
Dave

1
Peringatan kecil - jika Anda mengalami masalah Anda tidak akan mendapatkan pesan kesalahan deskriptif.
RobertH

Menggunakan fitur " Import repository " GH adalah pilihan yang tepat 95% dari waktu. Namun, jika gagal, itu tidak memberikan pesan kesalahan yang membantu dan Anda harus menghubungi dukungan GH. Saya tidak bisa menggunakannya untuk satu repo karena berisi file besar (> 100MB). Saya perlu menggunakan metode CLI yang diterima , menghapus file besar sebelum mendorong repo ke GH.
LS

125

Jika Anda tidak dapat menemukan tombol "Impor kode" di github, Anda dapat:

  1. langsung buka Importir Github dan masukkan url. Itu akan terlihat seperti:Cuplikan layar importir github
  2. berikan nama (atau akan mengimpor nama secara otomatis)
  3. pilih Publicatau Privaterepo
  4. Klik Begin Import

UPDATE: Baru-baru ini, Github mengumumkan kemampuan untuk " Mengimpor repositori dengan file besar "


Sayangnya ini tidak berhasil untuk usaha saya dari codebasehq ke git-hub, memberikan "URL ini tidak didukung". :(
sjmcdowall

@sjmcdowall Maaf tidak, tapi saya yakin seharusnya sudah berfungsi karena URL codebasehq menunjuk ke repositori git.
biniam

URL tidak ada lagi.
Coded Container

@ CodedContainer Saya baru saja memeriksa dan berfungsi. Saya bahkan memperbarui tangkapan layar sekarang.
biniam

1
URL hanya akan mengembalikan 404 jika Anda tidak masuk ke GitHub. Jika Anda masuk, alat impor akan memuat.
Jason Hurt

41

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

Ini membantu saya berpindah dari satu penyedia git ke yang lain. Pada akhirnya, semua komit ada di tujuan git. Sederhana dan lurus ke depan.

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

Setelah saya senang bahwa push telah berhasil ke GitHub, saya bisa menghapus remote lama dengan mengeluarkan:

git remote rm bitbucket

2
Harap sertakan bagian tautan yang relevan dalam jawaban Anda karena harus dapat berdiri sendiri.
k0pernikus

Saya mendapatkan kesalahan yang mengatakan "Kesalahan: gagal mendorong beberapa referensi ke petunjuk ' url.gi ': pembaruan ditolak karena remote berisi pekerjaan yang tidak Anda miliki secara lokal. Ini biasanya disebabkan oleh repositori lain yang mendorong ke ref yang sama. Anda mungkin ingin mengintegrasikan perubahan jarak jauh (misalnya menarik ...) sebelum mendorong lagi. Lihat catatan tentang fast-forward dalam git push --help untuk detailnya.
Coded Container

1
ini adalah satu-satunya jawaban yang masih berfungsi pada 3/3/2019 :)
Wang-Zhao-Liu QM

13

Saya memiliki kasus penggunaan terbalik mengimpor repositori yang ada dari github ke bitbucket.

Bitbucket juga menawarkan alat Impor . Satu-satunya langkah yang diperlukan adalah menambahkan URL ke repositori.

Sepertinya:

Cuplikan layar alat impor bitbucket


5

Saya menyadari ini adalah pertanyaan lama. Saya menemukannya beberapa bulan yang lalu ketika saya mencoba untuk melakukan hal yang sama, dan dikecewakan oleh jawaban yang diberikan. Mereka semua sepertinya berurusan dengan mengimpor dari Bitbucket ke GitHub satu repositori sekaligus, baik melalui perintah yang dikeluarkan à la carte, atau melalui importir GitHub.

Saya mengambil kode dari proyek GitHub bernama gitter dan memodifikasinya sesuai kebutuhan saya.

Anda dapat memotong intinya , atau mengambil kode dari sini:

#!/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

Lalu, untuk menggunakan skrip:

# 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

5

Ada Mengimpor repositori dengan GitHub Importir

Jika Anda memiliki proyek yang dihosting di sistem kontrol versi lain sebagai Mercurial, Anda dapat secara otomatis mengimpornya ke GitHub menggunakan alat Importir GitHub.

  1. Di sudut kanan atas halaman mana pun, klik, lalu klik Impor repositori.
  2. Di bawah "URL klon repositori lama Anda", ketikkan URL proyek yang ingin Anda impor.
  3. Pilih akun pengguna atau organisasi Anda untuk memiliki repositori, lalu ketikkan nama repositori di GitHub.
  4. Tentukan apakah repositori baru harus publik atau pribadi.
    • Repositori publik dapat dilihat oleh pengguna mana pun di GitHub, jadi Anda bisa mendapat manfaat dari komunitas kolaboratif GitHub.
    • Tombol radio repositori publik atau pribadi Repositori swasta hanya tersedia untuk pemilik repositori, serta kolaborator mana pun yang Anda pilih untuk berbagi.
  5. Tinjau informasi yang Anda masukkan, lalu klik Mulai impor.

Anda akan menerima email saat repositori telah sepenuhnya diimpor.

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

2

Jika Anda ingin memindahkan repositori git lokal ke hulu lain, Anda juga dapat melakukan ini:

untuk mendapatkan url jarak jauh saat ini:

git get-url remote asal

akan menampilkan sesuatu seperti: https://bitbucket.com/git/myrepo

untuk mengatur repositori jarak jauh baru:

git remote set-url origin git@github.com: folder / myrepo.git

sekarang dorong isi cabang saat ini (kembangkan):

git push --set-upstream asal berkembang

Anda sekarang memiliki salinan lengkap cabang di remote baru.

secara opsional kembali ke git-remote asli untuk folder lokal ini:

git set-url asal remote https://bitbucket.com/git/myrepo

Memberi manfaat sekarang Anda bisa mendapatkan repositori git baru dari github di folder lain sehingga Anda memiliki dua folder lokal yang menunjuk ke remote yang berbeda, yang sebelumnya (bitbucket) dan yang baru tersedia.


2

Saya membuat skrip bash berikut untuk mengkloning SEMUA repositori Bitbucket (pengguna) saya ke GitHub sebagai repositori pribadi .


Persyaratan:

  • jq (prosesor JSON baris perintah) | MacOS:brew install jq

Langkah:

  1. Buka https://github.com/settings/tokens dan buat token akses. Kami hanya membutuhkan ruang lingkup "repo".

  2. Simpan move_me.shskrip di folder yang berfungsi dan edit file sesuai kebutuhan.

  3. Jangan lupa CHMOD 755

  4. Lari! ./move_me.sh

  5. Nikmati waktu yang Anda simpan.


Catatan:

  • Ini akan mengkloning repositori BitBucket di dalam direktori tempat script berada (direktori kerja Anda.)

  • Script ini tidak menghapus repositori BitBucket Anda.


Perlu pindah ke repositori publik di GitHub?

Temukan dan ubah "private": trueke di "private": falsebawah ini.

Memindahkan repositori organisasi?

Lihat panduan pengembangnya , beberapa suntingan lagi.


Selamat bergerak.

#!/bin/bash

BB_USERNAME=your_bitbucket_username 
BB_PASSWORD=your_bitbucket_password

GH_USERNAME=your_github_username
GH_ACCESS_TOKEN=your_github_access_token

###########################

pagelen=$(curl -s -u $BB_USERNAME:$BB_PASSWORD https://api.bitbucket.org/2.0/repositories/$BB_USERNAME | jq -r '.pagelen')

echo "Total number of pages: $pagelen"

hr () {
  printf '%*s\n' "${COLUMNS:-$(tput cols)}" '' | tr ' ' -  
}

i=1

while [ $i -le $pagelen ]
do
  echo
  echo "* Processing Page: $i..."
  hr  
  pageval=$(curl -s -u $BB_USERNAME:$BB_PASSWORD https://api.bitbucket.org/2.0/repositories/$BB_USERNAME?page=$i)

  next=$(echo $pageval | jq -r '.next')
  slugs=($(echo $pageval | jq -r '.values[] | .slug'))
  repos=($(echo $pageval | jq -r '.values[] | .links.clone[1].href'))

  j=0
  for repo in ${repos[@]}
  do
    echo "$(($j + 1)) = ${repos[$j]}"
    slug=${slugs[$j]}
  git clone --bare $repo 
  cd "$slug.git"
  echo
  echo "* $repo cloned, now creating $slug on github..."  
  echo  

  read -r -d '' PAYLOAD <<EOP
  {
    "name": "$slug",
    "description": "$slug - moved from bitbucket",
    "homepage": "https://github.com/$slug",
    "private": true
  }
  EOP

  curl -H "Authorization: token $GH_ACCESS_TOKEN" --data "$PAYLOAD" \
      https://api.github.com/user/repos
  echo
  echo "* mirroring $repo to github..."  
  echo
  git push --mirror "git@github.com:$GH_USERNAME/$slug.git"
  j=$(( $j + 1 ))
  hr    
  cd ..
  done  
  i=$(( $i + 1 ))
done

1
Script yang menarik, dikombinasikan dengan token. Rapi. Terpilih.
VonC

@VonC Terima kasih!
cenk

1

Berikut adalah langkah-langkah untuk memindahkan repositori Git pribadi:

Langkah 1: Buat repositori Github

Pertama, buat repositori pribadi baru di Github.com. Penting untuk menjaga repositori tetap kosong, mis. Jangan centang opsi Inisialisasi repositori ini dengan README saat membuat repositori.

Langkah 2: Pindahkan konten yang ada

Selanjutnya, kita perlu mengisi repositori Github dengan konten dari repositori Bitbucket kita:

  1. Lihat repositori yang ada dari Bitbucket:
    $ git clone https://USER@bitbucket.org/USER/PROJECT.git
  1. Tambahkan repositori Github baru sebagai remote hulu dari repositori yang diperiksa dari Bitbucket:
    $ cd PROJECT
    $ git remote add upstream https://github.com:USER/PROJECT.git
  1. Dorong semua cabang (di bawah: hanya master) dan beri tag ke repositori Github:
    $ git push upstream master
    $ git push --tags upstream

Langkah 3: Bersihkan repositori lama

Akhirnya, kita perlu memastikan bahwa pengembang tidak bingung dengan memiliki dua repositori untuk proyek yang sama. Berikut ini cara menghapus repositori Bitbucket:

  1. Periksa ulang apakah repositori Github memiliki semua konten

  2. Pergi ke antarmuka web repositori Bitbucket lama

  3. Pilih opsi menu Pengaturan> Hapus repositori

  4. Tambahkan URL repositori Github baru sebagai URL pengalihan

Dengan itu, repositori sepenuhnya menetap di rumah barunya di Github. Biarkan semua pengembang tahu!


-1

Cara paling sederhana untuk melakukannya:

git remote rename origin repo_bitbucket

git remote add origin https://github.com/abc/repo.git

git push origin master

Setelah push ke GitHub berhasil, hapus remote lama dengan menjalankan:

git remote rm repo_bitbucket
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.