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?
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
Kecuali ... repo Anda menyertakan file besar: masalahnya adalah, alat impor akan gagal tanpa pesan kesalahan yang jelas. Hanya Dukungan GitHub yang dapat mendiagnosis apa yang terjadi.
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?
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.
1º Buat repositori kosong baru di GitHub (tanpa readme atau licesne, Anda dapat menambahkannya sebelumnya) dan layar berikut akan menunjukkan
2º Di dalam untuk mengimpor opsi kode, Anda menempelkan repo dan voilà URL bitbucket Anda !!
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:
langsung buka Importir Github dan masukkan url. Itu akan terlihat seperti:
berikan nama (atau akan mengimpor nama secara otomatis)
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.
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 -- [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
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
Jika Anda memiliki proyek yang dihosting di sistem kontrol versi lain sebagai Mercurial, Anda dapat secara otomatis mengimpornya ke GitHub menggunakan alat Importir GitHub.
Di sudut kanan atas halaman mana pun, klik, lalu klik Impor repositori.
Di bawah "URL klon repositori lama Anda", ketikkan URL proyek yang ingin Anda impor.
Pilih akun pengguna atau organisasi Anda untuk memiliki repositori, lalu ketikkan nama repositori di GitHub.
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.
Tinjau informasi yang Anda masukkan, lalu klik Mulai impor.
Anda akan menerima email saat repositori telah sepenuhnya diimpor.
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.
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:
Akhirnya, kita perlu memastikan bahwa pengembang tidak bingung dengan memiliki dua repositori untuk proyek yang sama. Berikut ini cara menghapus repositori Bitbucket:
Periksa ulang apakah repositori Github memiliki semua konten
Pergi ke antarmuka web repositori Bitbucket lama
Pilih opsi menu Pengaturan> Hapus repositori
Tambahkan URL repositori Github baru sebagai URL pengalihan
Dengan itu, repositori sepenuhnya menetap di rumah barunya di Github. Biarkan semua pengembang tahu!
Jawaban:
Anda dapat merujuk ke halaman GitHub " Menggandakan repositori "
Ini menggunakan:
git clone --mirror
: untuk mengkloning setiap referensi (komit, tag, cabang)git push --mirror
: untuk mendorong segalanyaItu akan memberi:
Seperti yang Tercatat dalam komentar oleh LS :
Import Code
fitur dari GitHub yang dijelaskan oleh MarMass .Lihat https://github.com/new/import
sumber
Ini sangat sederhana.
1º Buat repositori kosong baru di GitHub (tanpa readme atau licesne, Anda dapat menambahkannya sebelumnya) dan layar berikut akan menunjukkan
2º Di dalam untuk mengimpor opsi kode, Anda menempelkan repo dan voilà URL bitbucket Anda !!
sumber
/import
di bagian akhir URL dengan/settings
untuk mengakses pengaturan dan menghapusnya.Jika Anda tidak dapat menemukan tombol "Impor kode" di github, Anda dapat:
url
. Itu akan terlihat seperti:Public
atauPrivate
repoBegin Import
UPDATE: Baru-baru ini, Github mengumumkan kemampuan untuk " Mengimpor repositori dengan file besar "
sumber
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.
sumber
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:
sumber
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:
Lalu, untuk menggunakan skrip:
sumber
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.
Anda akan menerima email saat repositori telah sepenuhnya diimpor.
sumber
Jika Anda ingin memindahkan repositori git lokal ke hulu lain, Anda juga dapat melakukan ini:
untuk mendapatkan url jarak jauh saat ini:
akan menampilkan sesuatu seperti: https://bitbucket.com/git/myrepo
untuk mengatur repositori jarak jauh baru:
sekarang dorong isi cabang saat ini (kembangkan):
Anda sekarang memiliki salinan lengkap cabang di remote baru.
secara opsional kembali ke git-remote asli untuk folder lokal ini:
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.
sumber
Saya membuat skrip bash berikut untuk mengkloning SEMUA repositori Bitbucket (pengguna) saya ke GitHub sebagai repositori pribadi .
Persyaratan:
brew install jq
Langkah:
Buka https://github.com/settings/tokens dan buat token akses. Kami hanya membutuhkan ruang lingkup "repo".
Simpan
move_me.sh
skrip di folder yang berfungsi dan edit file sesuai kebutuhan.Jangan lupa
CHMOD 755
Lari!
./move_me.sh
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": true
ke di"private": false
bawah ini.Memindahkan repositori organisasi?
Lihat panduan pengembangnya , beberapa suntingan lagi.
Selamat bergerak.
sumber
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:
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:
Periksa ulang apakah repositori Github memiliki semua konten
Pergi ke antarmuka web repositori Bitbucket lama
Pilih opsi menu Pengaturan> Hapus repositori
Tambahkan URL repositori Github baru sebagai URL pengalihan
Dengan itu, repositori sepenuhnya menetap di rumah barunya di Github. Biarkan semua pengembang tahu!
sumber
Cara paling sederhana untuk melakukannya:
Setelah push ke GitHub berhasil, hapus remote lama dengan menjalankan:
sumber