Tag: Git

Git: How to count member’s commits

Posted by – October 7, 2013

在 Git 裡計算 commits 數量個人是覺得沒什麼意義,頂多就是看著數字,滿足一下虛榮心吧。跟看磁碟重組的小方塊差不多。

$ git shortlog -s -n
65 CQ
34 Robin
12 Diro
8 micky

類似這樣,參考參考。

[Updated: 12-11-2013]

如果想查詢全部共有多少 commits,可以用以下指令:

$ git rev-list HEAD --count
119

Git .gitignore file for Xcode projects

Posted by – June 27, 2013

最近才開始整理一些在寫 Obj-C 時當作測試用的範例程式碼,想丟去 GitHub 作個紀錄。

因為這樣才開始在 Xcode 裡使用 Git。雖然 Xcode 本身有整合 Git,但是那個整合還蠻陽春的,連 .gitignore 要怎麼設定都沒點提示。

.gitignore 是 Git 程式碼管理系統裡用來指定哪些檔案不需被追蹤用的文字檔。

看在 Xcode 專案裡的檔案分佈,哪些要忽略還真不容易分辨。一樣是在 StackOverflow 看到幾個解答,在這筆記一下。

# Xcode
.DS_Store
*/build/*
*.pbxuser
!default.pbxuser
*.mode1v3
!default.mode1v3
*.mode2v3
!default.mode2v3
*.perspectivev3
!default.perspectivev3
xcuserdata
profile
*.moved-aside
DerivedData
.idea/
*.hmap

這樣再看 Xcode projects 就清爽多了。

Update Jun 28, 2013

另一種寫法

# Exclude the build directory
build/*

# Exclude temp nibs and swap files
*~.nib
*.swp

# Exclude OS X folder attributes
.DS_Store

# Exclude user-specific XCode 3 and 4 files
*.mode1
*.mode1v3
*.mode2v3
*.perspective
*.perspectivev3
*.pbxuser
*.xcworkspace
xcuserdata

How to undo a Git pull?

Posted by – June 24, 2013

不經一事,不長一智啊....

以前用 Git 幾乎都是一人專案,最近才開始有協同工作的專案。這天在 fetch 了新的進度後,就很順手 pull 了... 然後就爆了。

因為我忘記切換 branch 就 pull,結果被合併到別線上去了。還好只有我本機掛掉,大不了砍掉 repo 重建一次就好。

不過想想還是看一下怎麼回復上一動好了,StackOverflow 真是工程師的好朋友。

用此指令可以查 HEAD 變化的歷史紀錄。

$ git reflog show

結果如下

$ git reflog show
cc7cb8e HEAD@{0}: pull pic3@dropbox user/auth: Merge made by the 'recursive' str
3686266 HEAD@{1}: commit: Database Schema
ea26bdb HEAD@{2}: checkout: moving from ea26bdb27a04284e03a119207ade4602d78c06cf
ea26bdb HEAD@{3}: checkout: moving from user/auth to ea26bdb27a04284e03a119207ad
a6310cb HEAD@{4}: commit: user/auth dev
fbaa5a7 HEAD@{5}: checkout: moving from inc/bootstrap to user/auth
7401efb HEAD@{6}: commit: Twitter Bootstrap

可以看到上一個動作是 HEAD@{0} pull 的行為,所以要回復到 HEAD@{1} 的狀態。用以下指令回復。

$ git reset HEAD@{1}

剛回復後檔案會遺留剛剛合併後的檔案,把它們移除就可以了。收工。

Sublime Text 2 Recommended Settings and Plugins

Posted by – June 2, 2013

Sublime Text 2 是近幾年竄起的一款文字編輯器,在 PC、Mac、Linux 平台上都有為數不少的粉絲。雖然我在開發工作上還是傾向使用 IDE 環境,Sublime Text 2 強大又方便的種種設計,仍是一款必裝的軟體。

[updated: Mar 14, 2014]

最近又入手一台 Mac Mini,新主機上也設置了開發環境,在這邊順手記錄一下 Sublime Text 2 的相關資訊。

Preference.sublime-settings

{
    "bold_folder_labels": true, // 左側Sidebar的目錄名稱變為粗體字
    "caret_style": "smooth",    // 測試中
    "fade_fold_buttons": false, // 行號旁邊的程式碼收折箭不隱藏
    "font_face": "Droid Sans Mono", // 換個字型試試
    // "font_face": "inconsolata",
    "font_size": 15.0,
    "highlight_line": true,     // 高亮目前游標所在行
    "ignored_packages":
    [
        "Vintage"
    ],
    "line_padding_bottom": 1.5, // 行距 (下)
    "line_padding_top": 1.5,    // 行距 (上)
    "rulers":                   // 顯示80字和120字提示
    [
        80,
        120
    ],
    "translate_tabs_to_spaces": true,
    "trim_trailing_white_space_on_save": true, // 存檔時移除行尾空白
    "word_wrap": false         // 不自動折行
}

其中的 Inconsolata 字型需要自己下載安裝,是個人很推薦的一款定距字型,如果是 Windows 平台的話,我更喜歡微軟的 Consolas 字型Droid Sans Mono 字型是我裝來測試效果的。

安裝 Sublime Package Control,按下 Ctrl + ` 打開 console 視窗。(Mac 的按法,Windows 的.... 我不知道...)

貼上以下字串...

import urllib2,os; pf='Package Control.sublime-package'; ipp=sublime.installed_packages_path(); os.makedirs(ipp) if not os.path.exists(ipp) else None; urllib2.install_opener(urllib2.build_opener(urllib2.ProxyHandler())); open(os.path.join(ipp,pf),'wb').write(urllib2.urlopen('http://sublime.wbond.net/'+pf.replace(' ','%20')).read()); print('Please restart Sublime Text to finish installation')

之後按 Shift + Command + P,輸入  packins 之類的模糊字串就會出現 Package Install 的選項了。

ST2 Package Install

至於推薦的套件嘛.... 目前裝得不多。依字母順序排序。

[updated: Mar 14, 2014]

ColorPicker [按下 shift + cmd + c 會叫出調色盤]

SublimeAutoSemiColon [自動將分號移到行尾]

SublimeCodeIntel [加上 IDE 工具那樣可以追蹤變數的宣告位置 ctrl + click][已移除,PHP 支援度不佳]

Sublime Alignment [按下 ctrl + command + a 可以依等號排列]

Sublime SFTP [讓 sublime text 讀寫 FTP 檔案的套件]

Emmet [編寫 HTML 的輔助工具]

GitGutter [在行號旁邊顯示 git 狀態的工具][已移除,執行速度太慢]

DockBlockr [方便的區塊註解輔助工具]

以上。

移除 Git Repo 中的敏感資料… [solved]

Posted by – April 9, 2013

原本我的程式碼都託管在 BitBucket.org 上,選擇這家服務是因為他們的計費方式是算人頭的,而不是算專案數,對於我個人的小專案來說等於是無限的免費使用。

最近和幾個對程式開發有興趣的朋友、同事在 GitHub 上弄了 Private Repository,開始有了將幾個小專案丟過去讓大家參與開發的念頭。不過因為許多專案在初期我就把帳密等一些敏感訊息也跟著 commit 出去了,年輕不懂事

需要把 repo 裡的敏感檔案刪除。

GitHub 有一篇教學文 Remove sensitive data。但是第一次耍蠢,忘記切換到 master 就下刪除指令,結果 history 變成這樣....

git_error_1

於是 git branch -D phpQRCode 移除了整條線。重下一次指令... 這樣的情況有點囧.... Tag 沒有移過去,不曉得是不是因為沒下 --tag-name-filter cat 的關係。總之,現在感到相當困擾。繼續研究怎麼處理。

git_error_2

 

 

[Updated: 2013-04-22]

後來用 rebase 先整理過 history 後,用以下指令移除檔案。

git filter-branch -f --tag-name-filter cat --index-filter 'git rm --cached --ignore-unmatch -- path/file' --prune-empty -- --all

藍字是要移除的檔案,紅字 -f 是如果先前已經使用過 filter-branch 指令,則 git 會自動產生一份備份,-f 是強制覆蓋掉之前的備份。如果要還原到 filter-branch 之前的狀態,用以下指令。

git reset --hard refs/original/master

Git: Archive modified files only

Posted by – November 27, 2012

專案上線後通常還會視需求追加功能或修正臭蟲,公司的政策是每次的版更都只佈署變動過的檔案,以減少不必要的風險。

不過每次版更,都要從版本紀錄裡把修改過的檔案一支一支挑出來,打包成 ZIP 檔寄給 MIS。這個步驟非常消耗腦細胞,一次佈署可能動輒數十支檔案,一支一支挑出來非常麻煩,還有可能漏失檔案。

科技始終來自於人性,在這樣手動更新了幾次後就受不了了,來研究一下可行的方案。

Git 有 archive 指令可以打包檔案,但看來只能打包一整個版本的全部檔案 (?)。

另外有 git diff 指令可以查詢特定版本之間的差異。跟 Mac OS bash 的指令結合一下就可以了。

zip <filename>`git diff --name-only 版號1 版號2`

filename 就是要輸出的檔名,我通常會用 PROJECT_NAME_patch_revXXXXX.zip 的方式命名,讓 mis 能馬上看懂這是什麼專案 (PROJECT_NAME) 的第幾個版本 (revXXXXX) 以什麼型式封裝 (patch) 的檔案,如果是整個專案的檔案而非變動檔的話,用 full 的字樣代替。

所以指令長這個樣子:

zip qodingus_patch_rev23c5ae.zip `git diff -name-only HEAD df923h`

版號可以用 tag 名稱代替。接著我只要把這個熱騰騰的 zip 傳送給 mis,我的工作就結束了,輕鬆愉快。

[unfinished] CentOS Server Git Setup

Posted by – September 26, 2012

http://cse.csusb.edu/turner/wiki/CentOS_Server_Git_Setup

http://netlog.jpn.org/r271-635/2008/01/apache_ssl_on_fedora_8_1.html

http://memo-off.blogspot.tw/2012/03/centosgit.html

http://www.bluevariant.com/2012/05/comprehensive-guide-git-gitolite-synology-diskstation/