聚會時間公告: 因應COSCUP 2011, Kalug 8月份休會一次

三月 14, 2013

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Git denying non-fast forward 問題

最近幫別公司處理 denying non-fast forward 的 git server 問題,沒事就別動檔案權限,不管是不是修改內容,只要用 chmod 指令,Git 還是會判別檔案變動。處理 git push 直接給我噴

$ git push --force origin master
Total 0 (delta 0), reused 0 (delta 0)  
error: denying non-fast forward refs/heads/master (you should pull first)  
To git@git.example.com:myrepo.git  
! [remote rejected] master -> master (non-fast forward)  
error: failed to push some refs to 'git@git.example.com:myrepo.git'

會遇到這問題的原因是使用者將不該 commit 的程式碼都 push 到伺服器上面,例如資料庫帳號密碼,個人帳蜜等等,這真的是不應該,解決方式也沒有很難,只要用 git reset –hard 到您需要的 commit hash 值,並且 git push –force 方式蓋掉 Server 上面的程式碼,但是如果遇到 git push –force origingit push –force origin master 都無作用,那就請加上底下設定

$ git config --system receive.denyNonFastForwards false

在 Github 上面怎麼用 force 都可以直接覆蓋,私人自己架設的,請加入此設定,但是這設定基本上蠻危險的,如果用 git reset –hard xxxx,xxx 為很久以前的版本,並且 force 到 Server 上面,那就等於沒救了 XD,所以用 –force push 到 server 上面時,請小心阿,基本上可以搭配 git cherry-pick 來撿還需要的 commit 內容。

Ref:
git cherry-pick 處理專案 pull request
Git reset –hard and a remote repository
7.1 Customizing Git – Git Configuration

二月 6, 2012

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 新人 Git 版本控制教學

昨日去台北簡報如何快速學習 git,投影片主要是給新手 git 基礎介紹,如何使用 branch model,git submodule 及 tag。內容不會很難,適合之前就玩過任何一套 version control 的使用者來閱讀,如果有 svn 基礎,學習會比較輕鬆。簡報搭配 github 內容來教學。

投影片內容參考 Git Pro book 這網站教學,大家可以直接看原文說明,會更清楚 Git 使用。

Related View

十月 23, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Github 支援 SVN Client

Github 一年前宣佈開始支援 SVN Client,不過這是必須透過 https://svn.github.com 才可以取得資料,跟一般 git 的網址不一樣,然而就在最近宣佈了同步支援 svn 也可以存取 https://github.com/,並且過不久的將來會移除 https://svn.github.com/ 網域。

URL 處理

git 方式:

$ git clone https://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan git-ds
Cloning into git-ds...
remote: Counting objects: 4177, done.
remote: Compressing objects: 100% (665/665), done.
remote: Total 4177 (delta 3544), reused 4140 (delta 3509)
Receiving objects: 100% (4177/4177), 2.65 MiB | 239 KiB/s, done.
Resolving deltas: 100% (3544/3544), done.

svn 方式:

$ svn checkout https://github.com/appleboy/PHP-CodeIgniter-Framework-Taiwan svn-ds
A    svn-ds/branches
A    svn-ds/branches/develop
A    svn-ds/branches/develop/README
A    svn-ds/branches/develop/changelog.html
A    svn-ds/branches/develop/index.html
A    svn-ds/branches/develop/license.html
.......

官網還陸續介紹了 svn 如何在 github 上面的使用,如果對 svn 熟悉的朋友們我想也不陌生了,還沒熟悉 git 之前,我想可以先用 svn 玩 github 功能。底下是 github 打算將來支援的 svn 功能

  • 支援 branch merging 和 rebasing
  • better mapping of Subversion <=> GitHub user names in commits
  • 支援 annotate/blame
  • 讓 trunk 可以對應到 git branch 除了 master 之外

參考:
Improved Subversion Client Support

Related View

十月 17, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 轉移 Github 上的 Private Repository 到 BitBucket …

Bitbucket

看到 gslin 大神寫了一篇 把 GitHub 上的 private repository 搬到 BitBucket 上…,最近自己也把一些不能公開的專案轉到 BitBucket 上面,由於在 BitBucket 上面可以無限開 private repository,所以我想也沒有必要付費給 Github,雖然論 Web 功能上而言,Github 還是略勝一籌,個人還是比較習慣 github 有 Network 的圖形可以看,不過平常還是都是在打指令,所以也沒差了,在 push 速度上面,感覺 BitBucket 也沒有輸 github 許多,所以決定就轉過去了,人總是為了錢所考量,當然 BitBucket 還是有些缺點的,可以參考之前寫的 Bitbucket 開始支援 Git Repository

底下介紹兩種方式來轉移 Github 的 Repo 到 BitBucket:

透過 BitBucket 提供的 tool

只要把 github 上的 Repository 網址複製下來,透過 BitBucket import tool 介面來轉換就可以了,這方法比較簡單懶人,如果你熟悉 git 的操作,就可以透過第二種方法來弄。

透過 git push

先在 BitBucket 建立一個空的 private repo,之後把網址複製,打開原本 clone 下來的專案 .git/config,將 url 換成剛剛建立的 repo url 即可。接著打入底下指令去 push 即可。

$ git push origin master

當然如果你有很多 branch 的話,請重複上面步驟即可。

Related View

十月 13, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 在 CentOS 上面安裝 Ruby 環境

centos

目前開發網站都傾向於用 Compass 這套 CSS Framework 來 develop,開發之前必須把環境先弄好,就是要有 Ruby 套件才可以安裝 Compass,網路上的教學幾乎都在是 Ubuntu 底下用 apt-get 方式來安裝,其實相當方便,但是 FedoraCentOS 就是要用 yum 方式來安裝,這次碰到 CentOS 竟然 yum search git 出來的結果是空的,所以決定全部都透過 tar 的方式來安裝全部套件了。由於 Fedora 幾乎都可以找到套件,但是碰到 rubygems 需要用到 ruby 1.8.7 以上版本,所以還是乖乖的用 tar 方式吧。

大家可以試試看透過底下 yum 方式安裝:

yum install -y ruby ruby-devel rubygems

雖然 Fedora 透過上面可以安裝成功,可是 ruby 跟 rubygems 的版本根本是…太舊了吧 …

安裝 git

yum 方式:

yum install git

利用 tar 方式,先到 git download 專區 找到 1.7.7 版本

$ yum install curl-devel
$ wget http://git-core.googlecode.com/files/git-1.7.7.tar.gz
$ tar -zxvf git-1.7.7.tar.gz && cd git-1.7.7
$ ./configure
$ make && make install

安裝 Ruby

透過 yum 安裝好的 Ruby 版本太舊,乾脆直接衝最新版

$ wget ftp://ftp.ruby-lang.org//pub/ruby/1.9/ruby-1.9.2-p0.tar.gz
$ tar -zxvf ruby-1.9.2-p0.tar.gz
$ cd ruby-1.9.2-p0
$ ./configure
$ make && make install

安裝好打入 ruby -v 你會發現還是舊的版本,那是因為新版裝在 /usr/local/bin 底下,而 yum 方式安裝的會在 /usr/bin 底下,所以改變一下 $PATH 變數順序即可

$ export PATH=/usr/local/bin:$PATH
$ ruby -v
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]

安裝 RubyGems

一樣到 RubyGems 下載最新版本

$ wget http://production.cf.rubygems.org/rubygems/rubygems-1.8.10.tgz
$ unzip rubygems-1.8.10.tgz
$ tar -zxvf rubygems-1.8.10.tgz
$ cd rubygems-1.8.10
$ ruby setup.rb

接著可以透過 gem 來安裝 Compass。Windows 請參考之前寫的 在 Windows 底下安裝 Compass CSS Authoring Framework

參考文章:
在CentOS 5上安裝Git

Related View

十月 4, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 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…等。

Related View

九月 27, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 版本控制 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 <file>..." 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)操作

Related View

九月 22, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 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。換句話說就是: 在您的專案底下,你可以任意將其他人的專案掛載在自己任何目錄底下

建立 Git Submodule

在練習 git 指令之前請先註冊好 github 帳號,並且開一個測試 repository,建立 Submodule 非常容易,範例如下:

git submodule add <repository> [<path>]

實際指令範例:

git submodule add https://github.com/appleboy/CodeIgniter-TW-Language user_guide

下這指令之前請注意最後面的 path 部份,請勿先建立空的目錄,也就是如果該目錄存在,就會衝突,所以並不需要額外幫 module 建立目錄,指令完成結果如下:

Cloning into user_guide...
remote: Counting objects: 32, done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 32 (delta 12), reused 32 (delta 12)
Unpacking objects: 100% (32/32), done.

這時候在目錄底下打入指令 git status,你會發現多了兩個檔案需要 commit

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       new file:   .gitmodules
#       new file:   user_guide
#

注意第一個檔案 .gitmodules,裡面紀錄 submodule 的對應關係,我們實際打開看內容:

[submodule "user_guide"]
    path = user_guide
    url = https://github.com/appleboy/CodeIgniter-TW-Language

裡面寫的很清楚,之後如果要清除 sub module 也是要從這檔案移除相關設定,接著就是直接 commit 到 project 底下吧

git commit -a -m "first commit with submodule codeigniter user guide" && git push

接著回去看 github 網站就會多出一個小圖示了
git_submodule
最後還是需要初始化 init submodule,透過底下指令來達成,否則 git 不知道你有新增 module

git submodule init

clone project with Git Submodule

我們還是拿上面的例子來測試,首先還是一樣用 git clone 來下載程式碼:

git clone git@github.com:appleboy/test.git test2

可是你有沒有發現 user_guide 這 sub module 是空目錄,這時候就是要透過 git submodule 來下載程式碼

[freebsd][root][ /home/git/test2 ]# git submodule init
Submodule 'user_guide' (https://github.com/appleboy/CodeIgniter-TW-Language) registered for path 'user_guide'
[freebsd][root][ /home/git/test2 ]# git submodule update
Cloning into user_guide...
remote: Counting objects: 32, done.
remote: Compressing objects: 100% (19/19), done.
remote: Total 32 (delta 12), reused 32 (delta 12)
Unpacking objects: 100% (32/32), done.
Submodule path 'user_guide': checked out '7efead6378993edfaa0c55927d4a4fdf629c4726'

注意上面,有沒有看到 git submodule init 來設定 .git/config,在接著用 git submodule update 來更新檔案,可以打開 .git/config 可以發現多了底下資料:

[submodule "user_guide"]
    url = https://github.com/appleboy/CodeIgniter-TW-Language

更新已安裝 module

一樣切換到 sub module 目錄,接著做 git pull

cd user_guide/
git pull origin master

這時候我們切回去上層目錄,執行 git status

# On branch master
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   user_guide (new commits)

我們有了 new commit,有沒有發現與 git submodule add 的時候一樣,這時候我們需要同步 sub module commit ID 到 parent,所以一樣執行 git commit && git push 即可。

git commit -a -m "first commit with submodule codeigniter user guide" && git push

最後可以透過 statu 來看看是否有相同的 commit ID

git submodule status

移除 Sub module

移除方式非常容易,上面有提到的檔案都必需要經過修改

1. 移除目錄

git rm --cached [目錄]
git rm [目錄]

2. 修改 .gitmodules,移除不需要的 module

vi .gitmodules

3. 修改 .git/config,移除 submodule URL

vi .git/config

4. 執行 commit

git add . && git commit -m "Remove sub module"

5. 最後 syn module 資料

git submodule sync

總結歸納

git submodule 可以用在跟其他團隊一起合作開發時候,我們只需要知道大的 git,一些細部的 sub module 就可以讓其他團隊在繼續往下開,相當方便。另外也避免每當要更新檔案的時候,還需要重複 clone 加上 cp 資料到對應目錄。

Reference:
Git Submodule 的認識與正確使用!
Pro git: git submodule

Related View

六月 27, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» 用 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 成上面的格式呢,其實很簡單,只要打入下面指令

git log --no-merges --pretty=format:' - %s'

–no-merges: 不要秀出 merge message
–pretty=format:’ – %s’ : 關鍵 format

另外我們還可以透過 –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

Related View

五月 4, 2011

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» svn 恢復略過衝突檔案 (conflict file)

當我們利用 svn up 更新程式碼,如果遇到修改相同檔案的相同地方,就會發生衝突 (conflict) 此時就必須修改或者是略過,當選擇略過此檔案就會出現底下訊息

Skipped ‘lib/logs/logDB.txt’
Skipped ‘lib/confs/Conf.php’
At revision 912.
Summary of conflicts:
Skipped paths: 2

之後怎麼用 svn up 更新檔案,都會因此被略過,那該怎麼恢復被略過檔案的狀態,讓它們可以繼續被更新呢?網路上找到一篇 svn local obstruction, incoming add upon merge 解法,用 svn resolve 來解決問題,只要針對該檔案打入底下指令即可

svn resolve --accept working lib/confs/Conf.php
svn resolve --accept working lib/logs/logDB.txt

Related View

八月 20, 2010

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Git 版本控制:利用 git reset 恢復檔案、暫存狀態、commit 訊息

這次來介紹一下 git reset 的用法,為什麼會介紹這指令呢?因為今天想要看專案狀態,用 git status 觀看,發現被我玩爛了,所以出現了底下錯誤訊息: $ git status error: bad index file sha1 signature ...詳全文(共2556字)

八月 18, 2010

小惡魔AppleBOY
AppleBOY
小惡魔 - 電腦技術 - 工作筆記 - AppleBOY is about »

tag cloud

» Git 版本控制: 「You have some suspicious patch lines」

相信大家對 Git 並不陌生,這次在升級 Moztw 的討論區,從 3.0.5 升級到 3.0.7 p1,過程由其他 Moztw 成員升級,我在將最後程式 commit 到 github,因為兩個版本差異性很大,所以有新增多個檔案,commit 過程出現了錯誤訊息:「You have some suspicious patch lines」,這是因為 git 會檢查每行程式碼最後是否有多餘空白或者是 Tab 按鍵,為瞭解決此問題,可以去修改 .git/hooks/pre-commit,將底下程式碼: ...詳全文(共743字)

A Feedjack powered Planet
A Django site.