0w0

2026/05

깃 저장소를 codeberg로 옮겼다.

깃허브, 깃랩에 있는 것을 선별해서 옮겨보니 실질적으로 약 240여개의 레포지토리에서 옮길만한 것은 12개 남짓이었다.

반성하게된다.

이런 생각이 있었는데 불필요한 것들을 걷어내고 보니 부족함이 많아 변화방법을 고심중이다.

레포지토리 전체를 옮기려고 파워쉘 스크립트를 실행해 옮겼다.

github

# --- 설정 부분 ---
$githubToken = "여기에_GITHUB_토큰_입력"
$codebergToken = "여기에_CODEBERG_토큰_입력"
$githubUser = "본인의_GITHUB_ID"
# ----------------

$headers_gh = @{ "Authorization" = "token $githubToken" }
$headers_cb = @{ 
    "Authorization" = "token $codebergToken"
    "Content-Type"  = "application/json"
}

# 1. GitHub에서 모든 저장소 정보 가져오기
echo "GitHub에서 저장소 목록을 불러오는 중..."
$url_gh = "https://api.github.com/user/repos?per_page=1000&type=owner"
$repos = Invoke-RestMethod -Uri $url_gh -Headers $headers_gh

echo "총 $($repos.Count)개의 저장소를 발견했습니다."

# 2. 반복문 돌며 Codeberg로 이행 명령 전송
foreach ($repo in $repos) {
    $name = $repo.name
    $isPrivate = $repo.private # GitHub의 공개/비공개 여부 그대로 가져옴
    
    echo "------------------------------------------------"
    echo "이행 시작: $name (Private: $isPrivate)"
    
    $body = @{
        "clone_addr" = $repo.clone_url
        "mirror"     = $false   # 지속적 동기화를 원하면 $true로 변경
        "repo_name"  = $name
        "private"    = $isPrivate
        "auth_token" = $githubToken
    } | ConvertTo-Json

    try {
        $response = Invoke-RestMethod -Method Post -Uri "https://codeberg.org/api/v1/repos/migrate" -Headers $headers_cb -Body $body
        echo "성공: $name 이행 요청 완료"
    } catch {
        echo "오류 발생 ($name): $_"
    }

    # 3. 과부하 방지를 위해 2초간 대기 (sleep)
    echo "안전을 위해 2초간 대기합니다..."
    Start-Sleep -Seconds 2
}

echo "------------------------------------------------"
echo "모든 작업이 완료되었습니다!"

gitlab

# --- 설정 부분 ---
$gitlabToken = "여기에_GITLAB_토큰_입력"
$codebergToken = "여기에_CODEBERG_토큰_입력"
$gitlabUser = "본인의_GITLAB_ID"
# ---------------------------

$headers_gl = @{ "Authorization" = "Bearer $gitlabToken" }
$headers_cb = @{ 
    "Authorization" = "token $codebergToken"
    "Content-Type"  = "application/json"
}

$page = 1
$allRepos = @()

# 1. GitLab에서 모든 프로젝트 목록 가져오기 (페이지네이션)
Write-Host "GitLab에서 프로젝트 목록을 가져오는 중..." -ForegroundColor Cyan
while ($true) {
    # GitLab API는 기본적으로 ID 기준 정렬이며, 본인 소유(owned=true)만 가져옵니다.
    $url_gl = "https://gitlab.com/api/v4/projects?owned=true&per_page=1000&page=$page"
    try {
        $response_gl = Invoke-RestMethod -Uri $url_gl -Headers $headers_gl
        if ($null -eq $response_gl -or $response_gl.Count -eq 0) { break }
        
        $allRepos += $response_gl
        Write-Host "페이지 $page 완료: 현재까지 $($allRepos.Count)개 수집됨"
        $page++
    } catch {
        Write-Host "목록 가져오기 실패: $_" -ForegroundColor Red
        break
    }
}

Write-Host "`n$($allRepos.Count)개의 프로젝트를 찾았습니다. 이행을 시작합니다.`n" -ForegroundColor Green

# 2. 반복문 이행
$count = 1
foreach ($repo in $allRepos) {
    $name = $repo.name
    # GitLab은 visibility가 'private'인 경우 비공개입니다.
    $isPrivate = $repo.visibility -eq "private"
    
    Write-Host "[$count / $($allRepos.Count)] '$name' 이행 중..." -NoNewline
    
    $body = @{
        "clone_addr" = $repo.http_url_to_repo
        "mirror"     = $false
        "repo_name"  = $name
        "private"    = $isPrivate
        "auth_username" = $gitlabUser  # GitLab 계정명
        "auth_password" = $gitlabToken # GitLab 토큰을 비밀번호 대신 사용
    } | ConvertTo-Json -Depth 10

    try {
        $response = Invoke-RestMethod -Method Post -Uri "https://codeberg.org/api/v1/repos/migrate" -Headers $headers_cb -Body $body
        Write-Host " [성공]" -ForegroundColor Green
    } catch {
        if ($_.Exception.Response.StatusCode -eq "Conflict") {
            Write-Host " [이미 존재함]" -ForegroundColor Yellow
        } else {
            # Codeberg 한도 초과 시 여기서 에러 메시지가 뜹니다.
            Write-Host " [실패: $($_.ErrorDetails.Message)]" -ForegroundColor Red
        }
    }

    $count++
    Start-Sleep -Seconds 2 # 안정적인 이행을 위해 2초 대기
}

다 옮겨지지 않아 내용을 보니 codeberg는 레포지토리 생성이 100개까지만 가능하기 때문에 그런 것이었다.


지원 사업을 진행하고 있다. 기술보호 울타리, 핵심기술 모니터링, 클라우드 지원사업 2개는 됐고, 1개는 발표 준비 해야한다.


poiyfill 말고도 ponyfill이라는 개념이 있다는 것을 알았다.

polyfill

import 'core-js/features/array/includes'; 

// 이후 코드 어디서든 '표준 문법'처럼 사용
const hasValue = [1, 2, 3].includes(2);

ponyfill

// 기능을 변수로 할당받음
import assign from 'object-assign';

const obj = assign({a: 1}, {b: 2});