自動檢查 Git Branch 是否 Merge 過
按照一般 Git branching model 來開發,當團隊人數稍多時,管理 Git branch 會變得有些麻煩。Branch 數量多之外,也很難記得哪些 branches 是已經 merge 進主幹、不再需要可以刪除;或者哪些 branches 沒有 merge 進主幹但已經放棄不用。這時就需要一些自動化的 script 幫助管理。
Read on →按照一般 Git branching model 來開發,當團隊人數稍多時,管理 Git branch 會變得有些麻煩。Branch 數量多之外,也很難記得哪些 branches 是已經 merge 進主幹、不再需要可以刪除;或者哪些 branches 沒有 merge 進主幹但已經放棄不用。這時就需要一些自動化的 script 幫助管理。
Read on →常在開發或測試階段會有更換 http request host 的需求。 簡單一點的方法就是直接更改 /etc/hosts 檔案。但如果連 port 都需要轉,那就需要其他方式了。
一般在 windows 上是推薦 fiddler 2 這套軟體,非常好用。可以參考 vexed 的文章。
不過在其他平台,可以使用 mitmproxy 這套軟體,他是 CUI 介面,操作上沒有 fiddler 那樣直覺,但稍微看一下說明即可上手。
mitmproxy 提供許多 API 讓使用者自訂需求,都使用 Python 來編寫。不過關於 script 的 document 較少,可以參考官方說明有簡單的範例,或者使用 pydoc libmproxy.flow.Request
這樣的指令來查閱,再不然就只能直接看原始碼了。
在 Git 操作的過程中,有些檔案是無法用 git checkout 救回來的。這些稱之為 unreachable files 。例如你 git add 了,但還沒 commit 就 pull ,這時這些檔案會被刪除,但因為沒有 commit 所以無法用 reset 救回。並且在 git reflog 裡面也不會有紀錄。
還好 Git 非常萬能,可以使用 git fsck --cache --unreachable
會列出一堆檔案的 bash ,再使用 git show <hash>
逐一檢視檔案內容即可救回失去的檔案。
It’s easy to generate a RSA keypair in PHP, just like this:
1 2 3 4 5 6 7 8 9 10 11 |
|
But when it comes to C, it’s not that simple.
You might want to use RSA_generate_key
and then PEM_write_RSAPublicKey
, but in fact, the output format of PHP’s openssl_pkey_get_details
is not a RSA public key.
If you want to get the same result in C, you have to convert your RSA keypair into EVP keypair.
Read on →如果 hostname 每一台都要自己一一指定相當麻煩,寫了一個小 script 放在開機時執行,抓取 instance-id 後取得 Name tag 再設定成 hostname。
這個議題類似上一篇 利用 Route 53 設定 Ec2 動態 DNS ,同樣也是要解決主機名稱對應浮動 ip 的問題。
雖然現在用完整域名已經可以對應到 ip ,但是還是有很多時候我們的主機需要知道主機名稱和 ip 的對應。
這個問題大概也是可以用 hosts 或 dns 來解決,不過由於我已經把 yp nis 架設起來,其他機器可以直接吃 nis 伺服器的 hosts 檔案,所以決定用 hosts 這個方式來處理。
概念很簡單,利用 ec2 api sdk 抓取正在運行的主機列表,一一寫入 /etc/hosts 後再重新 make yp 的資料庫。
設個排程每個小時跑一下或開新機器時手動執行一下即可。
script 如下:
最近在玩 aws ec2 第一個一定會碰到的問題就是 ip 都是動態的,每次開機都不一樣。造成大部分的佈署方式會有問題,一般都是用動態 dns 來解決,原本想自己架 bind 或 djbdns ,但是架好以後還要處理動態 dns 更新的機制,於是把想法動到價格低廉的 route 53 身上,他有完整的 restful api 應該很符合我的需求。
找到這個 script 是利用 http://checkip.dyndns.com 來抓取自己 ip 再更新 route 53 的 A record 。
不過 ec2 的 public dns 有一個特性,從外面解會解到 public ip ,但是從裡面解會解到 private ip ,同一個 availability zone 用 private ip 互連是不多收費的。
如果設 A record 使用 public 連線,就沒有這個優勢了,所以我改用 CNAME 指到 ec2 的 public dns。然後原本取得 ip 的部分也改用 aws 取 meta-data 就可以了。
具體作法,可以開一個 subdomain 例如 ec2.hsatac.net ,然後把這個 subdomain delegate 給我們的 route 53 來解析。在 DNS 的部分新增一筆 NS ec2.hsatac.net
然後 server 設定為 route 53 給的那幾組即可。
最近在玩 kvm,當 guest vm 的 network 環境不確定的時候,可以用 virt-viewer vnc 進去作設定,但總有沒有 X 或不適合使用 GUI 的狀況。這時可以利用 virsh console 這個指令進行連線。不過在 guest vm 要先修改一下設定。
首先修改 guest vm 的 /etc/grub.conf
,把 kernel 那行最後加上 console=tty0 console=ttyS0,1152200
例如:
1 2 3 4 |
|
重開 guest vm 之後,在 host 就可以用 virsh console <domain>
直接連到 ssh terminal 啦。
筆記一下在 CentOS 5 上設定 Python 2.6, hg 以及 mercurial-server。
CentOS 套件庫裡面有 hg ,不過版本很舊,而且 mercurial-server 的 hook 部分會需要 python 2.5+ 的特性,而官方套件庫裡的 hg 相依於 python 2.4,因此套件庫裡面的 hg 就不合用了。
sudo yum install python26 python26-devel
從 epel 安裝 python 2.6wget http://mercurial.selenic.com/release/mercurial-2.1.2.tar.gz
解壓後不要急著 make,先修改一下 MakefilePYTHON=python26
讓他抓 python 2.6doc 的部份應該是缺 docutils 所以會出錯,不需要 doc 直接砍掉:line 33 改為 all: build
, line 53 改為 install: install-bin
接著就可以 make all && su -c "make install" && hg version
installfiles: install pythoninstall
--system
,把 --system
改成 -r
。如果 repositories 的 path 想改可以順便修改 --home
的值。sudo make setup-useradd
就安裝好了/etc/mercurial-server/keys/root/
下,接著要改用 hgadmin 這個 repo 來設定hg clone ssh://hg@localhost/hgadmin
/etc/mercurial-server/keys
和 etc/mercurial-server/access.conf
複製過來。/etc/mercurial-server/access.conf
和 /etc/mercurial-server/keys
就可以刪除了。順便講一下 Redmine 和 hg 搭配,如果設定好後在 repositories 分頁一直 404,看 log 顯示 hg: error during getting info: hg exited with non-zero status: 255
的話,多半是檔案權限問題。
可以修改 redmine/config/environment.rb
打開 config.log_level = :debug
看更詳細的 log
應該可以看到實際執行的 hg 指令,用 redmine user 去執行看看就能抓出問題所在。
今天在 refactor 公司的 git repository 時,有個需求,是要把原本 A repository 的其中一個目錄抽出來,獨立成 B repository。
原本以為這個需求無法達成,不過做了點研究以後發現是可行的,甚至 B repository 是已存在的 repository 也可以做到!
先說獨立出新的 repository 這個狀況,很簡單,先 git clone 出一個乾淨的 A repository 然後 git remote rm origin
不要 track remote。
接著在 git 根目錄下 git filter-branch --subdirectory-filter <目錄> -- --all
你就會看到這個目錄以外的東西都不見了,而且相關的 commit log 還在。
如果是要獨立出一個新的 repository 做到這邊就可以結束了。
接著講要把檔案和 commit log 匯到已存在的 B repository:接續上一步,用 mkdir <你要的目錄>; mv * <你要的目錄>
把抽出來的檔案都移到你預想要放的目錄 git add .; git commit
後 cd ..
再用 git clone 把 B repository clone 出來,切到 B repository 的目錄,用 add local repository as remote 的方式 git remote add repoA ../<A repo 的目錄>
然後 git pull repoA master
就完成了。
參考:Moving Files from one Git Repository to Another, Preserving History