Git tips 請不要 commit 已經註解的程式碼

github-logo

上週看到一篇國外作者寫的 Please, don’t commit commented out code,裡面內文真的不得不按讚啊,對於每天都要 review code 的開發者來說,最不喜歡看到的就是類似下面的程式碼

this.test = function(req, res, next) {

  // if (foo) {
  //   return '1';
  // } else if (bar) {
  //   return '2';
  // }

  return 3;
};
Continue reading “Git tips 請不要 commit 已經註解的程式碼”

Git Server 噴 git upload-pack: git-pack-objects died with error

Git-Logo-2Color

透過 Gitlab 架設 Git Server 來放一些 Document 資料,由於個人 Document 都是 pdf 檔案,所以整個 Git Repository 就非常肥大,今天在 Clone 下來的時候,不僅是主機 CPU 飆高,然後記憶體被吃到快沒了,最後還噴出底下錯誤訊息

remote: Counting objects: 4912, done.
remote: fatal: Out of memory, malloc failed
error: git upload-pack: git-pack-objects died with error.
fatal: git upload-pack: aborting due to possible repository corruption on the remote side.
remote: aborting due to possible repository corruption on the remote side.
fatal: early EOF
fatal: index-pack failed

Continue reading “Git Server 噴 git upload-pack: git-pack-objects died with error”

Drone.io 搭配 Ruby 環境測試

相信現在 Git 已經是大家共通的版本控制工具,每當專案有新的 commit,我們可以透過 Travis 來幫忙做測試,但是 Travis 真的只有支援測試而已,如果測試成功想要進一步 Deploy 到任何機器或者是繼續做任何動作,這些都不支援的,那國外有些 Service 可以整合 GithubBitbucket Project 幫忙做到自動測試及 Deploy,比較常見的就是 Codeship,這服務非常強大,整合了 HerokuApp EngineNodejitsu .. 等服務,Deploy 也支援 Fabric, Puppet, Shell script 等等,這家的收費是看每個月做了多少次編譯測試動作,最便宜的方案每個月 $9 美金,只能編譯 50 次。 Continue reading “Drone.io 搭配 Ruby 環境測試”

在 git Commit 之前檢查 PHP 是否有錯誤

Git-Logo-2Color
在 commit code 之前,程式設計師必須確保程式碼的正確性,包含不要放入 debug message 到 git server,寫了一個簡單的 pre-commit 程式,來確保 PHP 是否有 Parse error,或者是在寫 CoffeeScript 及 JavaScript 時,常常會用到 console.* 來當作中斷點或者是顯示變數資料,這也是需要盡量避免 commit 到伺服器,你可不想要長官 review 的時候看到這麼多 debug 訊息吧。這時候就是需要 git-hookspre-commit 幫忙檢查這些 Syntax 語法,可以直接參考我的 git-hooks 專案。安裝方式很簡單:
$ git clone https://github.com/appleboy/git-hooks.git
$ chmod +x bin/hooks.sh pre-commit
$ ./bin/hooks.sh your_project_path
如果使用 git commit 之前,就會檢查 .js、.coffee、.php 等副檔名。

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 全部的內容,也相當方便 ^^