網頁

2015年4月20日 星期一

合併多個 Subversion 成一個 Git

轉換成 Git 的方法可以看這篇,這篇其實是先轉成 git 後,然後用 git 合併起來

方法一:subtree add

git subtree add --prefix=DIR1 git://git.repo.1 master
git subtree add --prefix=DIR2 git://git.repo.2 master
git subtree add --prefix=DIR3 git://git.repo.3 master
git subtree add --prefix=DIR4 git://git.repo.4 master

這是最簡單快速的方法,如果不介意看到一個新增目錄的 commit 出現的話。

 參考:http://stackoverflow.com/questions/1425892/how-do-you-merge-two-git-repositories

方法二:cherry-pick

這個做法會改寫原來 repo 的歷史紀錄,所以先 clone 一份出來測試。
mkdir temp
cd temp
git svn clone svn://repo1/
git svn clone svn://repo2/
git clone /path/to/repo3
git clone /path/to/repo4
然後到每個 repo 裡去調整目錄,這裡最簡單的作法是把它搬到某個 dir 裡:
git filter-branch --index-filter 'git ls-files -s | perl -pe "s{\t\"?}{$&SUB_DIR/}" |GIT_INDEX_FILE=$GIT_INDEX_FILE.new git update-index --index-info && if test -f "$GIT_INDEX_FILE.new"; then mv $GIT_INDEX_FILE.new $GIT_INDEX_FILE; fi' HEAD
參考:

轉移 Subversion 到 Git

準備

安裝 git svn
pkg install git-subversion-2.3.5

建立對應的使用者列表

在 svn project 目錄下,轉出 author.txt
svn log --xml | grep author | sort -u | perl -pe 's/.*>(.*?)<.*/$1 = /' > author.txt
把 author.txt 轉換成需要的格式如下:
john = john 
foo = foo 
kevin = kevin 
johnny = johnny 

轉換 svn 到 git repo

 git svn clone --trunk=/ --no-metadata --authors-file=author.txt svn://svn.my.doman/SVN-REPO-NAME NEW-GIT-REPO.git
這裡強烈建議!強烈建議!強烈建議! 不要過 http_dav_svn,就算沒跑 svnserve ,設定一下跑起來不過是五分鐘以內的事,可以省掉很多奇怪的問題,尤其是當你是陳年的 repo 不知道裡面塞了什麼鬼東西的時候。
接下來砍站,把整個 repo 抓下來:
 git svn fetch 
如果你不聽話或是情非得已過 http_mod_dav 然後出錯了,那就重複跑到結束吧。

刪除過大檔案


現在 svn 已經成功的轉成 git 了,在 NEW-GIT-REPO.git,要把它丟上 github 了嗎?
先別急,先砍一砍裡面太肥的檔案吧。
Github 目前是超過 50 MB 會跳警告,大於 100 MB 會跳錯誤。
所以參考官方網站的說明,用 BFG 來砍最簡單:

安裝 jre

pkg install openjdk8-jre-8.40.25_3

下載 bfg

fetch http://repo1.maven.org/maven2/com/madgag/bfg/1.12.3/bfg-1.12.3.jar
java -jar bfg-1.12.3.jar --strip-blobs-bigger-than 50M NEW-GIT-REPO.git/
git reflog expire --expire=now --all && git gc --prune=now --aggressive

塞上 github

去 github 上面把專案開好,然後照他給的下:
git remote add origin git@github.com:myORG/myProjectDir.git
git push -u origin master

萬一還是太大

如果你看到
Counting objects: 82461, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (29301/29301), done.
remote: fatal: pack exceeds maximum allowed size
error: pack-objects died of signal 132.00 GiB | 2.53 MiB/s
代表這一次的 commit 還是超過大小,只好拆開來塞:這裡有教你這麼做:
git push -u origin HEAD~1000:refs/heads/master
git push -u origin HEAD~500:master
git push -u origin master
不過我的 revision range 語法一直看不懂所以我改成
git push -u origin 某個commit的hash:refs/heads/master
git push -u origin 另外某個commit的hash:master
git push -u origin master
因為 git push 後面給某個 commit 的意思是,把這個 commit 之前都 commit,所以分開塞就可以啦。 至於怎麼找這段呢,就:
git log --pretty=oneline
萬一你發現,連塞一個 commit 都不行的話,那就恭喜你啦!!!那個 commit 太大啦.... 想辦法把那個 commit 分解一下吧....



 參考資料


2015年4月8日 星期三

DDNS on FreeBSD 10

最近種花電信在特價推 300M/100M ,於是弄了台 Brix GB-BXBT-1900 來玩,對於這種小板子就是無法抗拒。題外話,在台中丟的是 GB-BXi3H-4010 質感跟大小跟功能贏很多,當然比較貴一點點,不過有兩組 sodimm 跟 msata + HDD 還比較小台,唯一要注意的是沒有 D-SUB。

家裡用的就沒特別去申請固定 IP ,然後種花電信又老奸巨猾, 100M 以上的故意不給請 PPPOE 配發的偽固定 IP。沒關係,沒做啥大事業,用 no-ip 搞定,結果沒想到第二天就 GG 了,根本就不知道配去哪根電線桿了,於是只好來自幹吧。

目標:client 可以透過 bind 的 dynamic update 機制自動向 dns server 更新自己的 ip 。

參考來源

做法:

Server:


pkg install bind910
mkdir -p /usr/local/etc/namedb/keys
cd /usr/local/etc/namedb/keys
產生所需密鑰
dnssec-keygen -b 512 -a HMAC-SHA512 -v 2 -n HOST my.domain.
vim /usr/local/etc/namedb/named.conf
key my.domain. {
        algorithm "HMAC-SHA512";
        secret "COPY FROM PRIVATE KEY";
};

zone "my.domain" {
        type master;
        file "../dynamic/zone.fwd.my.domain";
        also-notify { SLAVE_DNS_IP;};
        allow-transfer { SLAVE_DNS_IP;};
        allow-update{
                key my.domain;
        };
};

Client:

pkg install bind-tools
把 Server 產的 Key 想辦法(用SCP)送回 client
vim update.sh
#!/bin/sh
MYNS="host.my.domain"
NSSERVER="ns.my.domain"
KEY="KeyPATH.private"
NOW_IP=`ifconfig tun0 | grep inet | cut -d ' ' -f 2`;
OLD_IP=`nslookup -type=a $MYNS | tail -n 3 | grep Address | cut -d ' ' -f 2`;

if [ $OLD_IP != $NOW_IP ]
then
echo "update IP: $NOW_IP to DDNS Server"
echo "server $NSSERVER " >> /tmp/.ddns.$$
echo "update delete $MYNS. A " >> /tmp/.ddns.$$
echo "update add $MYNS. 30 A $NOW_IP" >> /tmp/.ddns.$$
echo "" >> /tmp/.ddns.$$
nsupdate -k $KEY < /tmp/.ddns.$$
rm /tmp/.ddns.$$
fi
exit 0
然後 vim /etc/ppp/ppp.linkup 
HiNET:
  !bg /PATH_TO_THE_SCRIPT/updatens.sh
當中 HiNET 是 /etc/ppp/ppp.conf 裡面對應的 Label 搞定收工。

2014年12月31日 星期三

讓 OSX 下的 smbd follow symbolic links

在 /System/Library/LaunchDaemons/com.apple.smbd.plist 加上

        /usr/sbin/smbd
        -no-symlinks  

然後
$sudo launchctl unload  /System/Library/LaunchDaemons/com.apple.smbd.plist
$sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smbd.plist

2014年12月5日 星期五

在 OSX 下面開 samba

照著說明手冊沿路開一開會發現沒辦法選 user ,也無法 smbpasswd -a 所以找了一下。
連這種東西都需要密技的阿。

pwpolicy -u SomeUser -sethashtypes SMB-NT on
dscl . -passwd /Users/SomeUser "UserPassword"

來源

2014年11月27日 星期四

OSX 下的 ls color

灰白的世界令人不喜悅。
 所以加點顏色吧,已經習慣的配色,假設有換 csh 在 .cshrc 裡面加上
        setenv CLICOLOR 1
        setenv LSCOLORS ExGxFxdxCxDxDxBxBxExEx

2014年11月17日 星期一

在 OSX 上開機後自動啟動 vs-mda-remote

本來想得很簡單,應該是 /etc/rc.local 寫一下就好了沒想到還要轉一個大彎去用 launchd。

其實也不難,只是要翻一下文件跟範例,有需要的就笑納吧。
新增 /Library/LaunchDaemons/vs-mda-remote.plist

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
  <dict>
    <key>Label</key><string>VsMdaAgent</string>
    <key>ProgramArguments</key>
        <array>
        <string>/usr/local/bin/node</string>
        <string>/usr/local/bin/vs-mda-remote</string>
        <string>--secure</string>
        <string>false</string>
        <string>--serverDir</string>
        <string>/Users/VsMdaAgent/remote-builds/builds</string>
        </array>
    <key>KeepAlive</key><true>
    <key>LaunchOnlyOnce</key><true>
    <key>UserName</key><string>VsMdaAgent</string>
  </dict>
</plist>
然後測試一下:
啟動
launchctl load -F /Library/LaunchDaemons/tw.com.skymirror.vs-mda-remote.plist
停止
launchctl load -F /Library/LaunchDaemons/tw.com.skymirror.vs-mda-remote.plist
看一下 /var/log/system.log 有沒有錯誤訊息,然後 netstat -an |grep 3000 看有沒有跑起來。重開看看運作正不正常。

2014年11月4日 星期二

Mac mini server 2010 上 16G

最近因為工作需要,回去把之前塵封已久的 Mac mini server 2010 拿出來重新整理。

把主系統碟換上 SSD ,然後順便找了 16G (8G*2) 的 RAM 來換。

結果沒想到 2011 可以用的 DDR3-1333 8G 裝上之後竟然是給逼逼逼。 但是裝一條卻能正常抓到 DDR3 1333 * 8G ,一整個很詭異。 排列組合下,插 8G(1333)+4G(1066),有時候是抓到 1333 8G 有時候是抓到 1066 12G ,就想是不是因為 > 8G 跑 1333 會有問題。 然後不小心看到 這篇 所以就用了 Taiphoon burner 把其中一條的頻率降成 1066,果然就搞定收工了。

這麼說來,其實好像不太需要特別買 for apple 的,只要知道參數自己買時價的 memory 燒一燒就好了 (?)