Bitbucket 開始支援 Git Repository

Bitbucket
很高興剛剛收到 Bitbucket 寄來一封會員信,標題非常吸引大家的注意,那就是 Bitbucket now rocks Git.,是的,你沒看錯,Bitbucket 現在開始支援 Git repository,不再只有 Mercurial 可以使用,這還不算什麼,Bitbucket 更是推出無限制免費 private repos for free ,這樣的推出,不知道會有多少 Github 用戶轉移到 Bitbucket 上面,還有另一項主因就是 Unlimited disk space 無限制硬碟容量,不過也許不用高興的太早,Bitbucket 在使用者人數上面有些限制,可以參考 Plans & Pricing,免費方案每個 Repository 只能有5個 User,反觀 Github 並沒有這限制,不過我想這也不是問題,大家可以 Fork 到自己的專案,在 Pull Request 即可。 補充官方網站提供了轉換各大 Source Hosting 工具,目前支援 GithubSourceForgeGoogle CodeSubversionMercurial…等。

版本控制 svn move 移動或更名

公司採用 svn 當作版本控制,而我最近在整理 svn 上面全部的 source code。基本上我都會將 git 跟 svn 也一起搭配著用,因為個人比較熟悉 git 的操作方式,然而跟同事討論了專案目錄的架構,進而要把一些目錄轉換大小寫,本來的 App 就改成 app,這個在 git 底下(OS: Linux)操作非常容易,直接 git mv App app,之後看 git status 可以發現底下輸出:
# On branch develop
# Changes to be committed:
#   (use "git reset HEAD ..." to unstage)
#
#       renamed:    nav/hacks.txt -> Nav/hacks.txt
#       renamed:    nav/moo.fx.js -> Nav/moo.fx.js
#       renamed:    nav/moo.fx.pack.js -> Nav/moo.fx.pack.js
#       renamed:    nav/nav.js -> Nav/nav.js
#       renamed:    nav/prototype.lite.js -> Nav/prototype.lite.js
#       renamed:    nav/user_guide_menu.js -> Nav/user_guide_menu.js
#
可是在 svn 的流程不是這樣喔,首先 svn 會將原本的目錄先刪除,再來新增一個新目錄。這樣就算了,在 Windows 底下還不讓你這樣操作,請先裝 Subversion Client,然後請在”開始”->”執行” 打入 cmd,可以透過 svn mv 方式來操作
svn mv App app2
svn mv app2 app
如果裡面檔案目錄又很多的話,那就有的等了,畢竟對於 svn 而言都是在複製檔案,而不是像 git 是紀錄檔案差異。 Subversion的搬移(Move)操作

Git Submodule 介紹與使用

自己用 Git 已經很長一段時間了,沒用過 git submodule 的話真的是對不起自己,今天來筆記 Git Submodule 一些操作步驟及說明。

git Submodule 使用時機

大家在開發新專案的時候,不知道有沒有用到其他專案的程式碼,像是 Web 專案,也許會用到 Blueprintcss CSS Framwork 或者是 Sass,這些專案目前都放在 Github 上面進行維護,以前的作法就是先 git clone 下來,把要的檔案分別複製到自己專案,可是問題來了,如果官方更新了程式碼,那自己的專案如何更新呢?難道是重複步驟把檔案複製到原來地方嗎?這樣會不會太麻煩,這時候就是需要 git submodule 來幫助大家進行程式碼的更新,這樣隨時隨地都可以取得最新的程式碼。補充說明一點,git 目前無法針對單一專案底下的單一檔案或目錄進行 clone,而必須 clone 整個目錄,這點跟 svn 有很大的不同,所以 git 可以建立各個不同的 submodule 來整合成一個大型 Project。換句話說就是: 在您的專案底下,你可以任意將其他人的專案掛載在自己任何目錄底下Continue reading “Git Submodule 介紹與使用”

git cherry-pick 處理專案 pull request

很高興最近有些網路上朋友想要加入翻譯 CodeIgniter 的計畫,本人在 2009 年開啟這計畫時,就打算用當時蠻熱門的 git 來控管翻譯的進度,然而也選用了 github 來當作 Web 平台,可是大家對於入門 git 有很大的挫折,其實學習 git 沒有想像中這麼難,想要貢獻自己的程式碼都可以在 github 找到教學步驟,2009 年那時候 github 文件還尚未像現在這麼完整,入門之前可以先閱讀 git help 教學,貢獻程式碼之前可以先 Fork 專案,接著進行 Pull request,這些都是透過 Web 介面就可以做到了,但是大家在 pull request 之前記得先將專案程式碼更新,以及 pull request 時選取需要的 commit 阿,先看一個範例,有朋友發了一個 XML-RPC Class 翻譯的 Chinese Pull request 來,但是大家有沒有看到內容,裡面還包含了先前 Html Table 翻譯,所以這時候我就必須用 git cherry-pick 來挑選需要的 commit。

git cherry-pick 使用方法

我們如何 Merge 別人的 pull request,首先新增 remote add branch:

# gname 可以自己自訂
git remote add gname https://github.com/gname/PHP-CodeIgniter-Framework-Taiwan.git
# fetch 程式碼下來
git fetch gname
# 選取您要合併的 commit
# -n 代表多個 commit
git cherry-pick -n bf0246c8 ab3f4943
# 可以修改 commit log 內容
git commit -c bf0246c8

這樣就可以不用 merge 全部的內容,也相當方便 ^^

用 git 指令產生 Change log 格式

Git 真的是一套非常好用的版本控制工具,在網路上看到一篇 Making a Changelog from Git commit messages 裡面提到一篇新手必看的 git branch model,剛好這篇我也寫了中文解說的部份『Git 版本控制 branch model 分支模組基本介紹』,回歸正題,此篇是介紹如何用 git 指令產生 Change log 檔案,平常 Change log 都會寫成類似底下的 format:
 - Add Chinese Traditional language file
 - Changed to use count_all_results.
 - Added permissions checking to activation in example controller. 
 - Fixed an example in the userguide
 - changed phrases to more typical ones
在 git log 裡面寫了很多 commit message 該如何 format 成上面的格式呢,其實很簡單,只要打入下面指令
#
#--no-merges: 不要秀出 merge message
#--pretty=format:' - %s' : 關鍵 format
git log --no-merges --pretty=format:' - %s'
另外我們還可以透過 –graph 顯示圖形式的 log 顯示,指令如下:
git log --graph --pretty=format:'%s - %Cred%h%Creset  %Cgreen(%cr)%Creset %an' --abbrev-commit --date=relative
顯示結果如下
* Add Chinese Traditional language file - 1767c60  (4 months ago) Bo-Yi Wu
* Changed to use count_all_results. - 906d101  (4 months ago) Ben Edmunds
*   Merge branch 'master' of https://github.com/Kohtason/CodeIgniter-Ion-Auth into Kohtason-master - 599188d  (4 months ago) B
en Edmunds
|\
| * Fixed an example in the userguide - 65b0e05  (4 months ago) Sven Lueckenbach
| * changed phrases to more typical ones - 1941831  (4 months ago) Sven Lueckenbach
| * added ability to get usercount - b404fc3  (4 months ago) Kohtason
| * added ability to get usercount - b51e801  (4 months ago) Kohtason
| * added ability to get user-count - 11a85da  (4 months ago) Kohtason
* | Added permissions checking to activation in example controller.  Fixed bug in activation method in model. (via Phil Gyford) - c9ff
467  (4 months ago) Ben Edmunds
不多說,補一張圖,讓大家看看 git_log

版本控制 version control git clean 使用時機

在做公司的每一個案子,我都會使用 git 來做版本控制,雖然公司只有用 svn 控管,但是只要網路掛掉,就不能做任何事情了,更不用說 svn Server 掛點,因為 git 開 branch 免錢,因此每當我拿到新案子就按照 Git 版本控制 branch model 分支模組基本介紹 開了固定幾個 branch,由於剛開始 git init 沒有把 .gitignore 寫好,所以 commit 了一堆 *.o 或者是 *.ko 類似的檔案,我用了 git rm –cached 方式砍了,結果在切換 branch 的時候出現底下錯誤訊息:
error: Untracked working tree file ‘XXXXXXXX’ would be overwritten by merge.
這是因為當你 git rm –cached 檔案之後,切換 branch 時候會遇到衝突,本來的 master 分支還是存在這些檔案阿,因此這時候就要靠 git clean 來清掉移除檔案,可以利用 git help clean 來查看使用手冊。 Ref: Force git to overwrite local files on pull.

在 Ubuntu 安裝或升級 Git 版本控制的3種方法

Git 是目前還蠻 popular 的一套版本控制軟體,很多公司及大小型專案都用 g是it 來控管流程,或者是搭配 redmine 專案管理,然而 git 大家都會想到 github 這個儲存空間,免費註冊就有 300MB 的空間讓大家使用,如果對於 git 的使用方式,我推薦一個非常好的網站,就 git wiki,這網站不只是教你 git 指令應用,還收集了很多不錯的網站,底下介紹三種 git 的安裝方式:

1. Ubuntu 底下就用 apt-get 指令

# git core
apt-get -y install git-core git-doc git-gui gitk
如果你有用 Ubuntu 介面,就可以安裝 git-gui 跟 gitk 還不錯

2. 下載 Git Source 打包檔,並且編譯

apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
wget http://kernel.org/pub/software/scm/git/git-1.7.5.tar.gz
tar -zxvf git-1.7.5.tar.gz
cd git-1.7.5
make prefix=/usr/local all
sudo make prefix=/usr/local install

3. 用 git clone 來安裝

sudo apt-get install libcurl4-gnutls-dev libexpat1-dev gettext libz-dev libssl-dev
git clone git://git.kernel.org/pub/scm/git/git.git
cd git
git checkout v1.7.5
make prefix=/usr/local all
sudo make prefix=/usr/local install
可以參考 http://git.kernel.org/?p=git/git.git;a=tags 來選擇 checkout 編譯版本。 如果很要求版本最新的話,個人推薦方法 3 啦,另外推薦 A Visual Git Reference 這圖文並茂的網站,建議可以先看這裡的圖來瞭解 git 是如何運作的,這樣比較好上手喔 ^^

解決在 Ubuntu Terminal 底下 git diff 沒有輸出結果 10.10

自從把筆電安裝成 Ubuntu 10.10 maverick 後,把所有 github 上面程式碼都用 git clone 下來,最近遇到一個非常奇怪的問題,那就是修改檔案之後,正常來講,可以用 git diff 來查看修改過的程式碼,但是非常奇怪的事情就發生了,『完全沒有輸出』,後來在網路上找到一篇解法 git diff shows no output,原來是 $LESS 這個環境變數搞的鬼,其實可以用 git diff | cat 方式看到 diff 結果。 我們打開 .bashrc 發現底下設定
export EDITOR="vim"
export GIT_PAGER="less"
export LESS="-XEfmrSw"
export PAGER="most"
重點就在於 $LESS 必須加上 -X,並且請裝上 most 這指令
apt-get install most