---
# System prepended metadata

title: svn から git への移行 2021-12-18
tags: [git, svn, git svn, 移行]

---

---
lang: ja-jp
breaks: true
---
# svn から git への移行 2021-12-18

> ソース SVN リポジトリをローカル Git リポジトリに変換する
> https://docs.microsoft.com/ja-jp/azure/devops/repos/git/perform-migration-from-svn-to-git?view=azure-devops

> git-svn - Bidirectional operation between a Subversion repository and Git
> https://git-scm.com/docs/git-svn

> SVN脳患者から見たGit
> https://qiita.com/kaityo256/items/81e7951a1ca2706955a4

> コミットはスナップショットであり差分ではない
> https://github.blog/jp/2021-01-06-commits-are-snapshots-not-diffs/


# 移行環境を準備する

https://gitforwindows.org/

https://tortoisesvn.net/

「command line client tools」を追加してインストールする。
![](https://i.imgur.com/393oJBV.png)


# すべての Subversion 作成者の一覧を取得する

ローカル Subversion チェックアウトのルートからすべての SVN ユーザーの一覧を抽出するには、次の PowerShell コマンドを実行します。
```shell=
svn.exe log --quiet | ? { $_ -notlike '-*' } | % { "{0} = {0} <{0}>" -f ($_ -split ' \| ')[1] } | Select-Object -Unique | Out-File 'authors-transform.txt'
```

以下のような形式で出力される
```shell=
honda = honda <honda>
tanaka = tanaka <tanaka>
nakamura = nakamura <nakamura>
VisualSVN Server = VisualSVN Server <VisualSVN Server>
```

## git-svn を使用して Subversion リポジトリを複製する

```shell=
git svn clone ["SVN repo URL"] --prefix=svn/ --no-metadata --authors-file "authors-transform.txt" --stdlayout c:\mytempdir
```

:::warning
上記、「git svn clone」でも複製できます。が、エラーになった場合に途中から再開できない。init -> fetch で複製すると再開したいリビジョン番号を指定して再開できます。
:::

リポジトリを格納するディレクトリを作成
```bash=
cd /g/svn/git
mkdir projectA
cd projectA
```

リポジトリを初期化
```bash=
git svn init \
    --trunk=projectA/trunk \
    --tags=projectA/tags/* \
    --branches=projectA/branches/* \
    --prefix=svn/ \
    https://192.168.xxx.xxx/svn/Reps
```

設定ファイルを変更
```bash=
vim .git/config
------
[core]
	repositoryformatversion = 0
	filemode = false
	bare = false
	logallrefupdates = true
	symlinks = false
	ignorecase = true
[svn-remote "svn"]
	url = https://192.168.xxx.xxx/svn/Reps
	fetch = projectA/trunk:refs/remotes/svn/trunk
	branches = projectA/branches/*:refs/remotes/svn/branches/*
	tags = projectA/tags/*:refs/remotes/svn/tags/*
------
```

:::warning
`refs/remotes/svn/～`の部分の `refs/remotes` は必須。`refs`がないと怒られる。`remotes`がないと、`git branch -r`コマンドで表示されなくなる。
:::

フェッチ
```bash=
git svn fetch
```

ブランチの確認
```bash=
git branch -a
git branch -r
```

ブランチを作成
```bash=
for BRANCH_NAME in $(git branch -r | grep -e '\(branches\|tags\)' | sed -e 's/  svn\///g'); do
    git branch "$BRANCH_NAME" "svn/$BRANCH_NAME"
done;
```

タグの作成
```bash=
for TAG_NAME in $(git branch -r | grep -e '\(tags\)' | sed -e 's/  svn\///g'); do
    git tag "$TAG_NAME" "svn/$TAG_NAME"
done;
```

リモートサーバの設定
```bash=
git remote add origin ssh://192.168.xxxx.aaaa/c/repos/projectA.git
```

リモートサーバにプッシュ
```bash=
git push -u origin --all
```

クライアントから確認
```bash=
git clone ssh://192.168.xxxx.aaaa/c/repos/projectA.git
```

###### tags: `git` `svn` `移行` `git svn`
