Cách tốt nhất để di chuyển một kho git với tất cả các nhánh và lịch sử đầy đủ từ bitbucket sang github là gì? Có một kịch bản hoặc một danh sách các lệnh tôi phải sử dụng?
Cách tốt nhất để di chuyển một kho git với tất cả các nhánh và lịch sử đầy đủ từ bitbucket sang github là gì? Có một kịch bản hoặc một danh sách các lệnh tôi phải sử dụng?
Câu trả lời:
Bạn có thể tham khảo trang GitHub " Sao chép kho lưu trữ "
Nó sử dụng:
git clone --mirror
: để sao chép mọi tham chiếu (cam kết, thẻ, chi nhánh)git push --mirror
: đẩy mọi thứĐiều đó sẽ cho:
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
Như đã lưu ý trong phần bình luận của LS :
Import Code
tính năng từ GitHub được mô tả bởi MarMass sẽ dễ dàng hơn . Nó rất đơn giản.
1º Tạo kho lưu trữ trống mới trong GitHub (không có readme hoặc licesne, bạn có thể thêm chúng trước) và màn hình sau sẽ hiển thị
2º Bên trong để nhập tùy chọn mã, bạn dán repo và voilà URL bitbucket của bạn !!
/import
phần cuối của URL bằng /settings
cách truy cập các cài đặt và xóa nó.
Trong trường hợp bạn không thể tìm thấy nút "Nhập mã" trên github, bạn có thể:
url
. Nó sẽ trông như:Public
hoặc Private
repoBegin Import
CẬP NHẬT: Gần đây, Github đã công bố khả năng " Nhập kho lưu trữ với các tệp lớn "
http://www.blackdogfoundry.com/blog/moving-reposeective-from-bitbucket-to-github/
Điều này giúp tôi chuyển từ một nhà cung cấp git sang một nhà cung cấp khác. Vào cuối của nó, tất cả các cam kết là trong git đích. Đơn giản và thẳng tiến.
git remote rename origin bitbucket git remote add origin https://github.com/edwardaux/Pipelines.git git push origin master
Khi tôi rất vui khi việc đẩy đã thành công với GitHub, tôi có thể xóa điều khiển từ xa cũ bằng cách phát hành:
git remote rm bitbucket
Tôi đã có trường hợp sử dụng ngược lại khi nhập một kho lưu trữ hiện có từ github sang bitbucket.
Bitbucket cung cấp một công cụ nhập khẩu . Bước cần thiết duy nhất là thêm URL vào kho lưu trữ.
Nó có vẻ như:
Tôi nhận ra đây là một câu hỏi cũ. Tôi đã tìm thấy nó vài tháng trước khi tôi đang cố gắng làm điều tương tự, và bị choáng ngợp bởi những câu trả lời được đưa ra. Tất cả đều có vẻ như đối phó với việc nhập từ Bitbucket vào GitHub một kho lưu trữ tại một thời điểm, thông qua các lệnh được ban hành, hoặc thông qua trình nhập GitHub.
Tôi đã lấy mã từ một dự án GitHub có tên là gitter và sửa đổi nó để phù hợp với nhu cầu của tôi.
Bạn có thể ngã ba ý chính , hoặc lấy mã từ đây:
#!/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
Sau đó, để sử dụng tập lệnh:
# 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
Có một Nhập kho với Trình nhập GitHub
Nếu bạn có một dự án được lưu trữ trên một hệ thống kiểm soát phiên bản khác là Mercurial, bạn có thể tự động nhập nó vào GitHub bằng công cụ Trình nhập GitHub.
Bạn sẽ nhận được email khi kho lưu trữ đã được nhập hoàn toàn.
Trong trường hợp bạn muốn di chuyển kho git cục bộ của mình sang một dòng khác, bạn cũng có thể làm điều này:
để lấy url từ xa hiện tại:
nguồn gốc git từ xa git
sẽ hiển thị nội dung như: https://bitbucket.com/git/myrepo
để thiết lập kho lưu trữ từ xa mới:
git nguồn gốc set-url từ xa git@github.com: thư mục / myrepo.git
bây giờ đẩy nội dung của chi nhánh (phát triển) hiện tại:
git đẩy - nguồn gốc thượng nguồn phát triển
Bây giờ bạn có một bản sao đầy đủ của chi nhánh trong điều khiển từ xa mới.
tùy chọn trở về git-remote gốc cho thư mục cục bộ này:
git nguồn gốc set-url từ xa https://bitbucket.com/git/myrepo
Cung cấp lợi ích bây giờ bạn có thể nhận kho lưu trữ git mới của mình từ github trong một thư mục khác để bạn có hai thư mục cục bộ cả hai trỏ đến các điều khiển từ xa khác nhau, trước đó (bitbucket) và cả hai mới có sẵn.
brew install jq
Tới https://github.com/settings/tokens và tạo ra một thẻ truy cập. Chúng tôi chỉ cần phạm vi "repo".
Lưu move_me.sh
tập lệnh trong một thư mục làm việc và chỉnh sửa tập tin khi cần thiết.
Đừng quên CHMOD 755
Chạy! ./move_me.sh
Tận hưởng thời gian bạn đã tiết kiệm.
Nó sẽ sao chép các kho lưu trữ BitBucket bên trong thư mục mà tập lệnh nằm trong thư mục làm việc của bạn.)
Tập lệnh này không xóa kho lưu trữ BitBucket của bạn.
Tìm và thay đổi "private": true
thành "private": false
bên dưới.
Hãy xem hướng dẫn dành cho nhà phát triển , đó là một vài chỉnh sửa.
Hạnh phúc di chuyển.
#!/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
Dưới đây là các bước để di chuyển kho Git riêng:
Bước 1: Tạo kho lưu trữ Github
Đầu tiên, tạo một kho lưu trữ riêng mới trên Github.com. Điều quan trọng là giữ cho kho lưu trữ trống, ví dụ: không chọn tùy chọn Khởi tạo kho lưu trữ này bằng README khi tạo kho lưu trữ.
Bước 2: Di chuyển nội dung hiện có
Tiếp theo, chúng tôi cần điền vào kho lưu trữ Github với nội dung từ kho lưu trữ Bitbucket của chúng tôi:
$ 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
Bước 3: Dọn dẹp kho cũ
Cuối cùng, chúng tôi cần đảm bảo rằng các nhà phát triển không bị nhầm lẫn bằng cách có hai kho lưu trữ cho cùng một dự án. Dưới đây là cách xóa kho lưu trữ Bitbucket:
Kiểm tra kỹ xem kho lưu trữ Github có tất cả nội dung không
Chuyển đến giao diện web của kho lưu trữ Bitbucket cũ
Chọn tùy chọn menu Cài đặt> Xóa kho lưu trữ
Thêm URL của kho lưu trữ Github mới dưới dạng URL chuyển hướng
Cùng với đó, kho lưu trữ hoàn toàn ổn định vào ngôi nhà mới của nó tại Github. Hãy để tất cả các nhà phát triển biết!
Cách đơn giản nhất để làm điều đó:
git remote rename origin repo_bitbucket
git remote add origin https://github.com/abc/repo.git
git push origin master
Khi quá trình đẩy tới GitHub thành công, hãy xóa điều khiển từ xa cũ bằng cách chạy:
git remote rm repo_bitbucket