Category: Version Control

How to migrate SVN with history to a new Git repository

Posted by – March 17, 2014

這個問題拖了好久...

公司所有新專案的版本管理系統都直接採用 Git 了。唯一還停留在 SVN 的是我手上一個持續了兩年多的專案,因為有其他廠商的工程師參與,所以一直說要轉換 Git,卻沒真的轉換... 一方面是沒有轉換的經驗,一方面是手上工作一多,還能用的 SVN 就繼續吧.... (懶

一直到上週跟客戶開完會後,主管指示快點處理這件事,所以就來試試看怎麼轉換了。 More

Git: Tag Already Exists in the Remote

Posted by – February 14, 2014

近來在幾個專案上不約而同地碰到 Git 標籤 (tag) 衝突的問題。

sourcetree_tag

More

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}

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

Update Subversion on Mac OS X 10.8

Posted by – May 21, 2013

雖然現在程式碼管理已經以 Git 為主了,不過偶爾需要維護一些舊案子還是會用 SVN,懶得轉了

Mac OS 本身有內建 SVN,不過卻是 1.6 版,最近修改一個舊案子就有碰到 project 已經升 1.7,Versions 和 SmartSVN 也用 1.7,唯獨 Terminal 下的 command line 卻是 1.6 的窘境。所以想說來更新一下好了,用最簡單的方法。

先到 http://www.wandisco.com/subversion/download 下載 for Mac OS 的 SVN,目前最新的版本為 Subversion 1.7.9 for OSX 10.8.x。接著依一般 App 安裝方式進行,預設安裝路徑為 /opt/subversion。

接著在 Terminal 輸入 export PATH=/opt/subversion/bin:$PATH 來變更系統路徑。醬醬,完成。

可以用 svn --version 來看版本號碼。

$ svn --version
svn, version 1.7.9 (r1462340)
compiled Apr 3 2013, 13:49:20

Copyright (C) 2013 The Apache Software Foundation.
This software consists of contributions made by many people; see the NOTICE
file for more information.
Subversion is open source software, see http://subversion.apache.org/

移除 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,我的工作就結束了,輕鬆愉快。

SVN: How to get list of files changed between two revisions

Posted by – November 13, 2012

公司在更新客戶的程式碼時慣例上是只傳送有變動的程式碼。

老實說我覺得還挺麻煩的,不是每個 SVN Client 都有提供這方面的功能,目前我還只會手動處理,希望能有更方便的方法匯出特定版本區間的變動檔案。

列出 x 與 y 兩個版本區間的變動檔案列表

svn diff -r x:y --summarize

打包變動過的檔案

zip patch_vXXX.zip `svn diff -r x:y --summarize . | grep . | awk '{print $2}' | grep -E -v '^\.$'`

列出資料夾裡的所有檔案

find . -type f

計算檔案數量

find . -type f | wc -l