Як перемістити сховище git з усіма гілками від bitbucket до github?


334

Який найкращий спосіб перемістити сховище git з усіма гілками та повною історією від bitbucket до github? Чи є сценарій чи список команд, які я повинен використовувати?


9
Github надає інструменти та документацію для цього: help.github.com/articles/… help.github.com/articles/…
4

Трохи запізнюється на вечірку, але ось сценарій для міграції: gist.github.com/chinmaya-n/cff02f1277c811deab2e550f2aad9967
inblueswithu

Відповіді:


394

Ви можете посилатися на сторінку 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

Як було відзначено в коментарі комісіонка LS :

  • легше використовувати Import Codeфункцію від GitHub, описану MarMass .
    Дивіться https://github.com/new/import
  • Якщо ... ваше репо не містить великий файл: проблема полягає в тому, що інструмент імпорту вийде з ладу без явного повідомлення про помилку. Тільки підтримка GitHub зможе діагностувати те, що сталося.

2
Цей метод створив для мене проблему (не впевнений, чи це проблема). Коли я відобразив репо від бітбукета до github, то для 5 гілок це відображається як "Порівняти та витягнути запит" у github. Він не показаний як гілки в github. Що я можу з цим зробити?
Сіддхарт

2
А далі як щодо питань і вікі?
Владислав Раструсний

@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

3
Це працює, якщо ви також хочете перемістити сховище з Github до Bitbucket.
simeg

1
Мені потрібно було скористатися цим методом, щоб скопіювати репо, оскільки він містив великий файл (> 100 Мб). GH не дозволить розміщувати великі файли у своїх репост. Я видалив великий файл, перш ніж натиснути репо на GH. Однак, заборона інших проблем, використання функції GH " Імпорт сховища " - це правильний вибір у 95% часу, як описано в іншій відповіді . Однак, якщо це не вдалося, воно не дає корисних повідомлень про помилки, і вам потрібно зв’язатися зі службою підтримки GH. Саме підтримка GH повідомила мене про обмеження розміру файлу.
LS

412

Це дуже просто.

Створіть нове порожнє сховище в GitHub (без readme чи licesne, ви можете додати їх раніше), і на наступному екрані з'явиться екран

Внутрішній варіант імпорту коду ви вставляєте репо і URL-адресу вашої URL-адреси bitbucket !!

Клацніть код імпорту


12
Ви справді відповідаєте на це запитання, оскільки прийнята відповідь показує лише загальний метод, пов'язаний з Git. Ваша відповідь простіше!
Еміль Бержерон

6
Ця відповідь хороша до тих пір, поки ви створюєте сховище, і це голо. Якщо хтось інший створив для вас сховище (як, наприклад, адміністратор інгаляції створення гілок), це не працює. Прийнята відповідь - це шлях в такому випадку.
Майстер.Аврора

4
Зверніться до тих, хто думає про використання цього методу, видаліть двофакторну автентифікацію на попередньому хості сховища перед тим, як скористатися цією послугою, інакше ви застрягнете в нескінченному циклі спроби видалити новостворений сховище в GitHub, і єдиний спосіб вийти з цього - це замінити /importна кінці URL-адреси /settingsдоступ до налаштувань та видалити його.
Дейв

1
Невеликий застереження - якщо ви зіткнетеся з проблемою, ви не отримаєте описового повідомлення про помилку.
RobertH

Використання функції GH " Імпорт сховища " - це правильний вибір у 95% часу. Однак, якщо це не вдалося, воно не дає корисних повідомлень про помилки, і вам потрібно зв’язатися зі службою підтримки GH. Я не міг використати його для одного репо, тому що він містив великий файл (> 100 Мб). Мені потрібно було використовувати прийнятий метод CLI , видаливши великий файл безпосередньо перед натисканням репо на GH.
LS

125

Якщо ви не змогли знайти кнопку "Імпортувати код" на github, ви можете:

  1. безпосередньо відкрийте імпортер Github та введіть url. Це буде виглядати так:Знімок екрана імпортера github
  2. дайте йому ім’я (або воно імпортує ім’я автоматично)
  3. виберіть Publicабо Privateповторно
  4. Клацніть Begin Import

ОНОВЛЕННЯ: Нещодавно Github оголосив про можливість " Імпортувати сховища з великими файлами "


На жаль, це не спрацювало для моєї спроби переходу з codebasehq на git-hub, давши "Ця URL-адреса не підтримується". :(
sjmcdowall

@sjmcdowall Вибачте, це не так, але я вважаю, що це повинно діяти, оскільки URL-код codebasehq вказує на сховище git.
біням

URL-адреса більше не існує.
Кодований контейнер

@CodedContainer Я щойно перевірив, і він працює. Я навіть оновив знімок екрана просто зараз.
Біням

1
URL поверне 404 лише у тому випадку, якщо ви не ввійшли в GitHub. Якщо ви ввійшли в систему, інструмент імпорту завантажиться.
Джейсон Херт

41

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

2
Будь ласка, включіть у відповідь відповідні частини посилання, оскільки вони повинні мати можливість самостійно стояти.
k0pernikus

Я отримую помилку, яка говорить "Помилка: не вдалося натиснути som refs на" url.gi "підказку: оновлення було відхилено, оскільки віддалений містить роботу, якої ви не маєте локально. Це, як правило, спричиняється іншим сховищем, яке підштовхує ту саму ref. Ви можете спочатку інтегрувати віддалені зміни (наприклад, потягнути ...), перш ніж натиснути знову. Детальніше дивіться у примітці про швидкі перемотки в git push --help.
Кодований контейнер

1
це єдина відповідь, яка досі працює в 3.03.2019 :)
Wang-Zhao-Liu QM

13

У мене був випадок зворотного використання імпорту існуючого сховища з github у бітбукет.

Bitbucket також пропонує інструмент імпорту . Єдиний необхідний крок - додати URL у сховище.

Це виглядає як:

Знімок екрана інструменту імпорту Bitbucket


5

Я усвідомлюю, що це старе питання. Я виявив це кілька місяців тому, коли я намагався зробити те саме, і був підтоплений отриманими відповідями. Вони, здавалося, мали справу з імпортом з Bitbucket в GitHub одного сховища за один раз, або через команди, видані à la carte, або через імпортер GitHub.

Я схопив код із проекту GitHub під назвою gitter та змінив його, щоб відповідати моїм потребам.

Ви можете роздрібнити суть або взяти код звідси:

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

5

Є імпорт сховища з імпортером GitHub

Якщо у вас є проект, розміщений в іншій системі управління версіями, як Mercurial, ви можете автоматично імпортувати його в GitHub за допомогою інструмента імпортера 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/

2

У випадку, якщо ви хочете перенести свій локальний сховище git в інший потік, ви також можете зробити це:

щоб отримати поточний віддалений URL:

git віддалене походження get-url

покаже щось на зразок: https://bitbucket.com/git/myrepo

щоб встановити новий віддалений сховище:

git віддалений набір URL-походження git@github.com: папка / myrepo.git

тепер натисніть вміст поточної (розвиваючої) галузі:

git push - setset upstream походження розвиватися

Тепер у вас є повна копія відділення на новому пульті.

необов'язково повернутися до оригінального git-remote для цієї локальної папки:

git віддаленого набору URL-адреси https://bitbucket.com/git/myrepo

Ви надаєте ту перевагу, що тепер ви можете отримати новий git-сховище з github в іншій папці, щоб у вас було дві локальні папки, обидві вказували на різні віддалені, попередню (бітбукет) та нову, обидві доступні.


2

Я створив наступний скрипт bash для того, щоб клонувати ВСІ мої сховища Bitbucket (користувача) до GitHub як приватних сховищ.


Вимоги:

  • jq (командний рядок процесор JSON) | MacOS:brew install jq

Кроки:

  1. Перейдіть на сторінку https://github.com/settings/tokens та створіть маркер доступу. Нам потрібна лише область "репо".

  2. Збережіть move_me.shсценарій у робочій папці та відредагуйте файл за потребою.

  3. Не забувайте CHMOD 755

  4. Біжи! ./move_me.sh

  5. Насолоджуйтесь заощадженим часом.


Примітки:

  • Він буде клонувати сховища BitBucket всередині каталогу, в якому знаходиться скрипт (ваш робочий каталог.)

  • Цей скрипт не видаляє ваші сховища BitBucket.


Потрібно перейти до загальнодоступних сховищ на GitHub?

Знайдіть і змініть "private": trueна "private": falseнаведене нижче.

Переміщення сховищ організації?

Ознайомтеся з посібником для розробників. Це ще кілька змін.


Щасливий рух.

#!/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
Цікавий сценарій, поєднаний з лексемою. Акуратний. Оголошено.
VonC

@VonC Дякую!
cenk

1

Ось етапи переміщення приватного сховища Git:

Крок 1: Створіть сховище Github

Спочатку створіть нове приватне сховище на Github.com. Важливо зберігати репозиторій порожнім, наприклад, не перевіряйте параметр Ініціалізуйте це сховище README під час створення сховища.

Крок 2. Перемістіть наявний вміст

Далі нам потрібно заповнити сховище Github вмістом із нашого сховища Bitbucket:

  1. Перевірте наявний сховище з Bitbucket:
    $ git clone https://USER@bitbucket.org/USER/PROJECT.git
  1. Додайте нове сховище Github як віддалене відділення сховища, перевірене з Bitbucket:
    $ cd PROJECT
    $ git remote add upstream https://github.com:USER/PROJECT.git
  1. Натисніть всі гілки (нижче: просто master) та теги до сховища Github:
    $ git push upstream master
    $ git push --tags upstream

Крок 3: Очищення старого сховища

Нарешті, нам потрібно забезпечити, щоб розробники не плуталися, маючи два сховища для одного проекту. Ось як видалити сховище Bitbucket:

  1. Двічі перевірте, чи є у сховищі Github весь вміст

  2. Перейдіть до веб-інтерфейсу старого сховища Bitbucket

  3. Виберіть опцію меню Налаштування> Видалити сховище

  4. Додайте URL-адресу нового сховища Github як URL-адресу переспрямування

З цим сховище повністю оселилося у своєму новому будинку в Ґітубі. Нехай всі розробники знають!


-1

Найпростіший спосіб зробити це:

git remote rename origin repo_bitbucket

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

git push origin master

Після успішного натискання на GitHub видаліть старий пульт запуском:

git remote rm repo_bitbucket
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.