前提

  • Linux Mint 20 (Ubuntu 20.04LTS ベース)

きっかけ

https://ibulog-iblog.hateblo.jp/entry/2020/06/14/015333

この記事を読んで、起動が 2〜3秒早くなる。という記述に興味を惹かれたので試しにやってみることに。

ポイント

  • ESP からしかカーネルをロードできない

ようするに、initrd.img と vmlinuz が /boot/efi に存在する必要がある。

普通にインストールすると、 /boot/efi(以降、ESP と呼ぶ)は、500MB の fat32 パーティションとして作られる。

initrd.img+vmlinuz で大体容量 100MB なので、余裕を見るとカーネルは3セットが限界。(4セットも行けると思うが)

当方の環境では、https://xanmod.org/ のカーネルが入っているので、これの最新で1セット、標準のカーネルと、標準のカーネルの一つ前のやつ。の3セットとした。

手順 1

できるだけギリギリまで後戻りできるような順番で作業した。

カーネルを ESP にコピーする systemd ユニットを作る

xanmod のカーネルは、標準のカーネルと違って vmlinuz / vmlinuz.old とか initrd.img / initrd.img.old みたいなのを作ってくれないので、/boot 自体に変更があったら全部のカーネルと initrd をコピーする構成とした。

以下の2ファイルを作成する。

/etc/systemd/system/systemd-boot-cp-to-efi.path

1
2
3
4
5
6
7
8
Description=Copy kernel and initrd to /boot/efi for systemd-boot
Documentation=man:systemd.path

[Path]
PathChanged=/boot/

[Install]
WantedBy=multi-user.target

/etc/systemd/system/systemd-boot-cp-to-efi.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Copy Kernel to ESP
Description=Trigger by path watch (systemd-boot-cp-efi.path)

[Service]
Type=oneshot

# ubuntu general kernel and initrd
ExecStart=/bin/cp -f /boot/vmlinuz /boot/efi/vmlinuz
ExecStart=/bin/cp -f /boot/initrd.img /boot/efi/initrd.img
ExecStart=/bin/cp -f /boot/vmlinuz.old /boot/efi/vmlinuz.old
ExecStart=/bin/cp -f /boot/initrd.img.old /boot/efi/initrd.img.old
ExecStart=/bin/bash -c '/bin/ls /boot/* | /bin/grep -e "\/boot\/vmlinuz.*xanmod" | /usr/bin/sort -Vr | /usr/bin/head -n 1 | /usr/bin/xargs -i /bin/cp -f {} /boot/efi/vmlinuz-xanmod'
ExecStart=/bin/bash -c '/bin/ls /boot/* | /bin/grep -e "\/boot\/initrd.*xanmod" | /usr/bin/sort -Vr | /usr/bin/head -n 1 | /usr/bin/xargs -i /bin/cp -f {} /boot/efi/initrd.img-xanmod'

systemd のユニットを有効化

ユニット有効化

1
2
3
$ sudo su -
# systemctl daemon-reload
# systemctl enable systemd-boot-cp-to-efi.path (serviceはenableにする必要はありません。してもエラーになります)

テスト

1
2
3
4
5
6
7
$ sudo su -
# rm /boot/efi/vmlinuz*
# rm /boot/efi/initrd*
# touch /boot/a (適当なファイルを/bootに作ってsystemdを反応させる)
# ls /boot/efi/ (予定通りコピーされているかチェック)
EFI initrd.img initrd.img.old vmlinuz vmlinuz.old
initrd.img-xanmod loader vmlinuz-xanmod

手順 2

systemd-boot のインストール

1
$ sudo bootctl install

ブートエントリ作成

カーネル3セット分のブートエントリを作成する。

/boot/efi/loader/entries/01xanmod.conf

1
2
3
4
title   Linux Mint (xanmod)
linux /vmlinuz-xanmod
initrd /initrd.img-xanmod
options root=LABEL=root quiet splash rw

/boot/efi/loader/entries/02ubuntu.conf

1
2
3
4
title   Linux Mint (ubuntu)
linux /vmlinuz
initrd /initrd.img
options root=LABEL=root quiet splash rw

/boot/efi/loader/entries/03ubuntu-old.conf

1
2
3
4
title   Linux Mint (ubuntu-old)
linux /vmlinuz.old
initrd /initrd.img.old
options root=LABEL=root quiet splash rw

デフォルト起動エントリの指定

/boot/efi/loader/loader.conf

1
2
3
#timeout 3
#console-mode keep
default 01xanmod # この行だけ変更。標準で起動させたい起動エントリの名前だけを書く(.confは書かない)

最終確認

1
2
3
4
5
6
7
8
9
$ efibootmgr

efibootmgr
BootCurrent: 0007
Timeout: 0 seconds
BootOrder: 0007,0005,0004,0003,0006,0002,0000 ←これが起動順
Boot0000* SanDisk SDSSDH3 500G :
Boot0005* ubuntu ←こっちはGRUB
Boot0007* Linux Boot Manager ←これがsystemd-boot

再起動

起動してくれば OK。おつかれさまでした。

蛇足

起動時に hp のロゴが出たまま →GUI ログイン画面になった。
起動が 2〜3秒早くなった。 なんかいい感じ。

why?

  • バージョンアップを続けた為か、WebUI で freenas-boot の容量警告(80%以上)が表示されてしまった。
  • 放置しても大丈夫そうな気がするが zabbix もアラートを出すので拡張したい
  • なお、FreeNAS は VM として動いている (Hyper-V)
1
2
2022/03/11 追記
この手順は TrueNAS Scale には適用できません

手順

VM のディスクを拡張

(省略)

この時点で、dmesg に以下のような表示が出るが出力の通り gpart commit da0 しても意味は無い

1
2
3
`(da0:storvsc0:0:0:0): Capacity data has changed
GEOM_PART: da0 was automatically resized.
Use `gpart commit da0` to save changes or `gpart undo da0` to revert them.

zpool を拡張する

zfs はディスク全体を使用しているのであれば zpool online -e [pool] [disk] で拡張した分を認識できるが、freenas-boot はパーティションを zfs pool として使用しているのでパーティションを拡張しないといけない。

パーティション拡張

zfs で使っているのパーティションを確認

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
`root@freenas[~]# zpool status freenas-boot
pool: freenas-boot
state: ONLINE
scan: scrub repaired 0 in 0 days 00:00:13 with 0 errors on Wed Jun 10 03:45:13 2020
config:

NAME STATE READ WRITE CKSUM
freenas-boot ONLINE 0 0 0
da0p2 ONLINE 0 0 0

=> 使っているパーティションは da0p2

root@freenas[~]# gpart show da0
=> 40 20971440 da0 GPT (10G)
40 532480 1 efi (260M)
532520 16220160 2 freebsd-zfs (7.7G)
16752680 4218800 - free - (2.0G)

この表示であれば、拡張する対象は 2 である。この数字を使って拡張する。

gpart resize -i 2 da0

-i の次の 2 がパーティション番号。特にサイズを指定していないので、使えるだけ使う。

1
2
3
4
`root@freenas[~]# gpart show da0
=> 40 20971440 da0 GPT (10G)
40 532480 1 efi (260M)
532520 20438960 2 freebsd-zfs (9.7G)

free が消えて、 freebsd-zfs が 9.7G に拡張された。

拡張した分を zfs に認識させる

1
`zpool online -e freenas-boot da0p2

これだけで OK。念のため確認する。

1
2
3
4
`zfs list
NAME USED AVAIL REFER MOUNTPOINT
freenas-boot 6.00G 3.20G 176K none

AVAIL が増えたことが確認できた。

WebUI のアラートも消えてスッキリした。

何に困っていたか

今作っている Web アプリが Springboot + Typescript で構成されているが、

Eclipse 上で Typescript を編集するのが辛いので、外部の Atom エディタと gulp を使って

編集 → コンパイルを行っている。しかし、Eclipse が gulp による変更を認識していないため、

ブラウザをリロードしても更新されたファイルを読んでくれない。

手動で対応するなら…

gulp のコンパイル後に、Eclipse のプロジェクトを右クリックしてリフレッシュを選択すればいい。

自動にしたいなら…

Eclipse の環境設定 -> 一般 -> ワークスペース にある

  • ネイティブフックまたはポーリングを利用してリフレッシュ
  • アクセス時にリフレッシュ

の二つにチェックを入れれば OK

注意

  • 外部で変更されるファイルを Eclipse 内で開いてしまうと、Eclipse 内のエディタの内容が優先される(=更新が反映されない)
  • 変更は確かに反映される。しかし、少なくとも MacOS X(El Capitan)では数秒に一度ポーリングしているだけなのでタイムラグはある。

TL;DR;

以下のコマンドで可能だった。

1
2
setterm -cursor off
ffmpeg -i http://stream-ip-or-hostname:80 -pix_fmt rgb565 -s 321:240 -f fbdev /dev/fb1
  • setterm -cursor off カーソルを OFF に。
  • ffmpeg: 標準でインストールされている。入っていなければ apt で
  • -i http://〜 再生するストリームの URL
  • -pix_fmt 表示する液晶のピクセルフォーマット…わけわからないが、間違えていたらエラーメッセージ中にこれを指定しろ的なのがあるので追加しただけ。
  • -s 321:240 表示するサイズ。表示するデバイスの解像度より大きいと見切れるので指定。320x240 が本来のスペックだが、右端に 1px の白いラインが出たので 1px 増やしてある
  • -f fbdev /dev/fb1 表示ドライバは fbdev。fbdev2 があって動くならそっちの方がよさげな動きをしていたが表示が乱れたので fbdev を指定。 /dev/fb1 はフレームバッファのデバイス名。

自動起動周り

/etc/rc.local に上記コマンドを書けば終わり。と言いたいところだが、上手くいかなかったので、pi ユーザーで自動ログインにしておいて、 /home/pi/.bashrc の末尾に上記コマンドを記述することで期待する動作になった。

ここに書いてしまうと、ssh で接続したときも実行されてしまうので、tty だったら。
という判定をいれた方が良いが、そこはスルーした。

CUI ログインと GUI ログインの切り替え

raspi-config で可能。 System -> Boot/Login あたりで可能。

細かい蛇足

背景

この話は一つ前の続きである。
ラズパイに 4DPi-32 を接続して、そこにストリーム動画(監視カメラ映像)を表示したかった。
監視カメラ映像は MotionEyeOS からのストリームである。
4DPi-32 を接続したことにより /dev/fb1 が生えている。これがなんか不思議なブツで
HDMI につないだモニタ or 4DPI-32 のどちらかに出力されるという不思議。
HDMI が/dev/fb0 で 4DPi が/dev/fb1 というならわかるのだが。
(/dev/fb0 に出力してもなんかおかしなノイズが出力されたり、HDMI に出力されたり…ほんとわからない)
フレームバッファって複数画面持てるのかなぁ。知識というか理解が足りてなかった。
正直、GUI というか映像とか動画を出すのだから X が必要だと思いこんでいた。
まだまだ知らないことばかりだなぁと思った。

上手く行かなかったこと

試したことを列挙しておく。(X11) は GUI でログインして動かしてみたものを指す。
ただし、VNC でリモート操作しているのでそれが失敗の原因の可能性もある。

VLC (X11)

X 上で vlc を使った再生を最初に試した。そもそもラズパイ ZERO で X を動かす事自体が
割と無謀。しかも液晶は 320x240 なので GUI がまともに操作できない。
また、VLC ではストリームを再生することができなかった。不思議。
テストとして mac 上の VLC で同じ操作をすると再生できるのに…
後でわかったが GPU 用のメモリが 64MB 割当だとダメという書き込みがあったので 128MB なら出来たかもしれない。

SMPlayer (X11)

apt install 可能。同じくストリームが再生できなかった。

cvlc(コンソール)

VLC をコンソールから動かすやつ。VLC と同じでストリームが再生できない。

このとき、MMAC ENOSPC 的なエラーがでたので GPU メモリ割当が不足していることがわかった。

mplayer(コンソール)

割と有名な気がする。フレームバッファへの書き込みは出来てローカルの avi は再生できたが、

なぜか HDMI 側に出力されてしまった。

omxplayer(コンソール)

HDMI 側にしか出力できなそうだった。フレームバッファに書き込む機能がなさげ。

ラズパイ用 Acceralated プレイヤーらしいので一番期待していたのだが。

ffmpeg(コンソール)

最初に、 -f RawImage /dev/fd1 とかやったときに 4DPi-32 にノイズが表示されて

一気にやる気が上がったのを覚えている。えらい。

何が起きた?

CentOS 7 を入れて、SELinux を無効化しようとしたが、何度やっても
設定が反映されない。

何やった?

/etc/sysconfig/selinux を編集した。
SELINUX=permissive
再起動したにもかかわらず、getenforce すると
Enforcing と出てしまう。設定が反映されてない。
#disable より permissive にしておけ!っていう記事を読んだので permissive

結論

https://www.centos.org/docs/5/html/5.1/Deployment_Guide/sec-sel-enable-disable.html

ここによると、 /etc/sysconfig/selinux は /etc/selinux/config へのシンボリックリンクらしいが、なぜか普通のファイルになっていた。

直接、 /etc/selinux/config を編集して再起動した所、設定が反映された。

その他

CentOS-7-x86_64-DVD-1503-01.iso を使ってインストールしたばっかりなんだけど
自分で壊したのかもしれない。

目的

  • 家のオンプレサーバーをインターネットに公開したいが、DS-Lite している為公開できない
  • VPN を使う事で、Oracle Cloud 上のサーバーを経由してオンプレ鯖のサービスを公開する。

URL

ホスト

  • クラウド Ubuntu 18.04LTS
  • ローカル Debian 10 Ubuntu 18.04LTS
  • 執筆時点 2020/04/14 では Debian 10 で wireguard をセットアップした際に ip link add dev wg0 type wireguardUnknown type となってしまった為 Ubuntu に変更

これはDebian 10だとカーネルが古い(4.9系)のでまだwireguardが標準で入っておらず、カーネルモジュールが必要なため。
echo 'deb http://ftp.debian.org/debian buster-backports main' | sudo tee /etc/apt/sources.list.d/buster-backports.list
をすればあとは apt-get でインストールできる。

セットアップ手順

クラウド側(サーバー側)

  • sudo add-apt-repository ppa:wireguard/wireguard
  • sudo apt-get update
  • sudo apt-get install wireguard
  • ip link add dev wg0 type wireguard
  • ip address add dev wg0 10.240.0.1/24
  • sudo su -
  • cd /etc/wireguard
  • wg genkey > private

Warning: writing to world accessible file.
Consider setting the umask to 077 and trying again.

  • chmod 077 private
  • wg pubkey < private

CzAAAAAAAAAAAAAAAAAAAAAAAuVg=

  • config を作成 (/etc/wireguard/wg0.conf)

/etc/wireguard/wg0.conf

1
2
3
4
5
6
7
8
[Interface]
PrivateKey = サーバー側秘密鍵 (private) の中身をコピペ
# Address = 10.240.0.1 参考にしたサイトではこれが記述されていたが、エラーとなるのでコメント化
ListenPort = 51820

[Peer]
PublicKey = クライアント側公開鍵(後で生成する)
AllowedIPs = 10.240.0.0/24

ローカル側(クライアント側)

  • sudo add-apt-repository ppa:wireguard/wireguard
  • sudo apt-get update
  • sudo apt-get install wireguard
  • ip link add dev wg0 type wireguard
  • ip address add dev wg0 10.240.0.20/24
  • sudo su -
  • cd /etc/wireguard
  • wg genkey > private

Warning: writing to world accessible file.
Consider setting the umask to 077 and trying again.

  • chmod 077 private
  • wg pubkey < private

CzBBBBBBBBBBBBBBBBBBBBBBuVg=

  • クライアント側 config を作成 (/etc/wireguard/wg0.conf)
1
2
3
4
5
6
7
8
9
[Interface]
# クライアント側秘密鍵
PrivateKey = このホストのprivate の中身

[Peer]
PublicKey = # サーバー側公開鍵
EndPoint = サーバー側公開IPアドレス:port
AllowedIPs = 10.240.0.0/24
PersistentKeepAlive = 30
  • ここでサーバー側 config ファイルのクライアント側 publickey が生成されるので config を直す。

接続開始

  • サーバー側、クライアント側 両方で wg setconf wg0 /etc/wireguard/wg0.conf

備考

  • サーバー側はポート開放が必要。
  • wg pubkey < private は、private の中身が同一であれば、何度やっても同じ結果が出る。

HTML5 的に好きな要素に Thymeleaf で値を埋めたい

th:attr を使えば良い。

下のサンプルは適当な名前にしていますが、正式にやるときは data-attr のように data-を付けて下さい。

1
2
3
4
5
6
7
8
9
<a href="#" th:attr="myattr=myvar">test</a>

myvar = "abc"のときの出力
=> <a href="#" myattr="abc">test</a>

<a href="#" th:attr="myattr1=myvarA,myattr2=myvarB">test</a>

myvarA="abc" / myvarB="XYZ"のとき
<a href="#" myattr1="abc" myattr2="XYZ">test</a>

Javascript にオブジェクトを埋め込みたい

以下の通りにすれば OK

  • script タグに th:inline=”javascript” を付ける
1
2
3
4
5
6
7
// 例
<script th:inline="javascript">
/*<![CDATA[>*/
var API_URL = /*[[ @{/api/test}]]*/ "dummy"; // URL埋め込み
var obj = /*[[${obj}]]*/ {}; // {"name":"test", "job" : "hagure-metal"}
/*]]>*/
</script>

権限がある人にだけ何かを表示する (SpringSecurity 連携)

取説は以下

https://github.com/thymeleaf/thymeleaf-extras-springsecurity

hasRole を使う

1
2
3
4
5
6
7
8
<code class="language-html"><li sec:authorize="hasRole('ROLE_ADMIN')">
<a href="/hoge">管理者にしか見えないリンク</a>
</li>

<!-- (少なくとも)SpringSecurity4以降なら ROLE_ は省略可能 -->
<li sec:authorize="hasRole('ADMIN')">
<a href="/hoge">管理者にしか見えないリンク</a>
</li>

authorize-url を使う

1
2
3
<li sec:authorize-url="/admin/">
<a href="/hoge">管理者にしか見えないリンク</a>
</li>

環境

  • Ubuntu 18.04
  • mastodon 2.4.3
  • redis-cli 4

やったこと

https://github.com/ken-washikita/zbx-templates-mstdn

このセットをつかっただけ。

ハマりポイント

redis-latency スクリプトが正常な値を返さなくて、値が取得できなかった。

対策

redis-latency.sh を以下のように書き換えた。

1
2
3
4
5
6
7
`#!/bin/bash

WORKFILE=/var/tmp/redis-latency
SAVEFILE=/etc/zabbix/redis/redis-latency

redis-cli --latency > $WORKFILE
cat $WORKFILE | cut -d ' ' -f 2 > $SAVEFILE

原因

ターミナルから、 redis-cli --latency を実行すると出力は以下のようになる。

1
2
`min: 0, max: 1, avg: 0.25 (165 samples)
# CTRL+Cで停止するまで更新し続ける。

しかし、出力をリダイレクトすると、値のみが出力されるように変更された模様。

1
2
3
$ redis-cli --latency > file
$ cat file
0 1 0.25

なお、元のスクリプトが max を取得していたので、変更したスクリプトもそれに習っている

蛇足

cron の設定

コマンドが標準エラー出力になにか吐いているのがいるので、それは捨てるかなにかしないと、メールがえらい数とんできて大変なことになります。(なりました)

redis のバージョン

Mastodon Production Guide に従った場合、redis はディストリビューションの標準バージョンが入るのですが、Ubuntu 16.04LTS の場合は 3.x で、この場合は元のスクリプトそのままで動きます。

postgres の監視は?

個人的には mamonsu がおすすめです。ただし、postgres はユーザー名/パスワードで認証するために、pg_hba.conf の修正が必要なのでそれを忘れると動きません。ハマるので注意!

お断り

本記事は古いです。

今は –expose と -port を適切に使い分けることで回避できます。

ただし、docker が iptables を自動的に設定しているのは変わらないです。

以下の記事がわかりやすかったです。

docker と ufw の設定が独立なせいで無駄にポートが開いてしまう件と、解決するための docker run オプションの記法について

https://qiita.com/jqtype/items/9574ef74868b73323939

以下、古い記述

具体的に何が危険なのか

コンテナのポートをホストにマップした場合( -p 80:80 )

そのポートは、ufw(ファイアウォール)の制限を受けません。

ようするに、そのポートは外からアクセス可能です。

ではどうすれば?

/etc/default/docker に以下を追記して下さい。

1
`DOCKER_OPTS="--iptables=false"

参考にした URL

http://askubuntu.com/questions/652556/uncomplicated-firewall-ufw-is-not-blocking-anything-when-using-docker

http://blog.viktorpetersson.com/post/101707677489/the-dangers-of-ufw-docker

所感

これを知らなかったので、Tomcat が Worldwide に公開されてたとか…恐ろしい

前書き

残念なお話

Subversion の複数のリポジトリを一気に移行する手段はありません。

一個ずつ地道にやるしかありません。

前提条件

  • Subversion のサーバーにアクセス可能、または  ダンプが取得可能なこと。
  •  作業用 PC に git がインストールされていること
  •  作業用 PC に Subversion がインストールされていること

動作確認環境

  • Subversion サーバー CentOS 5 Subversion 1.8
  • 作業用 PC macOS Sierra Subversion 1.9.4 git 2.11.0

Subversion サーバー上での作業

svnadmin dump を使ってダンプを取得する。

Subversionダンプ取得

1
svnadmin dump /opt/svn/reponame/ > svndump.dump

このダンプファイルは後で使いますので、作業する PC に持ってくる必要があります。

サーバー上でやるならそのままで OK です。

作業 PC 上での作業

Subversion リポジトリの準備

git に変換する対象だけが含まれた Subversion リポジトリを作業用 PC 上に準備します。

履歴のクリーニング

ゴミファイルがコミットされた履歴があったので、削除します。

※最新版からは消されていても、履歴に含まれていると git clone に時間がかかる原因になります。

ここの手順はオプションです。の時点ではまだ Subversion のダンプファイルに対しての作業です。

git は一切関係ありません。

ダンプファイルから不要なファイルを削除する

1
2
3
svndumpfilter exclude /document/ /sql/ /trunk/ruby/vendor/bundle/ /trunk/ruby/tmp/ < svndump.dump > svndump-clean.dump

excludeの後には、履歴からも削除するファイル (or ディレクトリ名)を列挙します。数に制限はありません。

ダンプファイルのロード

作業用 PC 内に、Subversion のリポジトリを作り、ダンプファイルをロードします。

※ 履歴のクリーニングを行ったのであれば、クリーニング済みのダンプ  ファイルを使用します。

1
2
3
4
5
# subversionリポジトリ作成
svnadmin create svnruby

# ダンプファイルのロード
svnadmin load svnruby/ < svndump-clean.dump

ローカルに Subversion サーバーを立てる

svn => git 変換時に file:// は使用できないので、サーバーをローカルに立ち上げる。

1
2
3
svnserve -d -R --foreground --root svnruby/

# ターミナルが占拠されるので、以降の作業は別ウィンドウで行う

git リポジトリへの変換

いよいよ、変換していきます。

Subversion アカウント名->git メールアドレスの読み替えファイルを作る

Subversion のコミット者は、アカウント名が記録されますが、git では、 名前 <メールアドレス> なので

対応表が必要です。ここでは、 svnauthors という名前で以下のような内容のファイルを作りました。

※私の場合は redmine と連携していたので、redmine のユーザー一覧から簡単に作る事ができました。

このファイルは履歴に対する変換表なので、現在いないユーザーでも履歴に含まれるのであれば設定が必要です。(適当な人に振っても良いと思いますが)

1
2
svnuser1 = Subversion user 1 <svnuser1@example.jp>
svnuser2 = Subversion user 2 <svnuser2@example.jp>

git リポジトリ生成

とりあえず、git リポジトリの生成だけします。

1
git svn init -s --prefix=svn/ svn://localhost/ gitruby/

Subversion -> git

Subversion リポジトリ内容を git に変換(取込)します。

1
2
> cd gitruby
git svn fetch -A ../svnauthors
  • 変換というか取込は Subversion のリポジトリから 1 コミットずつ取得して、その内容をそのまま git にコミットしていくイメージです。

コミット数・規模に応じて時間がかかります。

git の upstream に push

サーバーに push というと怒られそうなのですが、まぁサーバーに送ります。

実行前に、git branches でブランチを確認したり、中身がまともかどうかを確認したりした方が良いでしょう。

よさそうであれば、以下で push できます。よさそうでなかった場合は蛇足を読んで頂ければ。

1
2
> git remote add origin http://gitserver.example.jp/gitlab/TEST/test.git
git push

完了後の確認

github なりなんなりで確認して下さい。

お疲れ様でした。

参考にしたページ

git-svn で SVN→Git への移行をやってみたログ

http://qiita.com/hidekuro/items/4727715fbda8f10b6b11

Subversion から Git へ移行してみた

http://qiita.com/EichiSanden/items/326bdac596485baa6086

仕事で使ってる巨大 SVN レポジトリを Github に移管するためにやったことまとめ DQNEO 起業日記 http://dqn.sakusakutto.jp/2012/10/svn-git-github-migration.html

蛇足

普通ならこれで OK ですが、変換した SVN リポジトリは /trunk/ が空で、/branches/ruby に最新ソースが入るという

ちょっと意味不明な構成になっていました。本来であれば、 git svn init 直後に、 .git/config ファイルを修正

することで、適切に取込ができるのですが、幸い branches は git のブランチとして取り込まれるのでそのまま取込を実行して、後で直すという作業をしています。以下はその作業ログです。

さらに言うと、この取込を push する作業も何度もやっており、今までの履歴を全部消し飛ばしてやり直しというシチュエーションです。

※ git サーバー側は gitlab を使っており、 master ブランチを unprotect 済み、

※ 使用する git アカウントはプロジェクト管理者権限をもっています。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$ git branches
remotes/svn/ruby

$ git checkout remotes/svn/ruby
Note: checking out 'remotes/svn/ruby'.

You are in 'detached HEAD' state.(略)

$ git checkout -b master
Switched to a new branch 'master'

$ ls -l
(ファイルが存在するか確認)

$ git remote add origin http://gitserver.example.jp/gitlab/TEST/test.git

$ git push -f

$ git push -f origin master
(ユーザー名パスワード聞かれる)
(中略)
+ adff8c3...eafd1ace master -> master (forced update)

作業終了後は、gitlab 上で・・・

  • develop ブランチを作る
  • protect branch (master & develop)
  • デフォルトブランチを develop にする

作業完了です。(この辺、開発ルールによるのでご参考程度)