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?
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?
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:
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 :
Import Code
fitur dari GitHub yang dijelaskan oleh MarMass . 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 !!
/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
atau Private
repoBegin Import
UPDATE: Baru-baru ini, Github mengumumkan kemampuan untuk " Mengimpor repositori dengan file besar "
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
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:
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
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.
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.
brew install jq
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.
Ini akan mengkloning repositori BitBucket di dalam direktori tempat script berada (direktori kerja Anda.)
Script ini tidak menghapus repositori BitBucket Anda.
Temukan dan ubah "private": true
ke di "private": false
bawah ini.
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
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:
$ git clone https://USER@bitbucket.org/USER/PROJECT.git
$ cd PROJECT
$ git remote add upstream https://github.com:USER/PROJECT.git
$ 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:
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!
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