Showing posts with label git. Show all posts
Showing posts with label git. Show all posts

July 29, 2014

[git] 在 master 改了東西又下了 git pull 結果產生 conflict

很常遇到不太熟悉 git 的人發生這個問題,寫篇文記錄一下

正確解法:不要在 master 下改東西 (重複三遍)

以下的做法目的有兩個

  1. 保護之前在 master 的工作內容安全
  2. 讓 master 恢復正常狀態
在 master branch
  • git add .
  • git commit
  • git branch -b helpme
到此為止所有的東西都在 helpme 這個 branch 了
  • git checkout master
  • git reset --hard origin/master
這個時候 master 就恢復到正常運作狀態

至於原本的工作內容,我個人的習慣是使用 rebase
  • git checkout helpme
  • git rebase master
修完 conflict 再 merge 回 master

May 31, 2013

[git] git branching model

前情提要是這篇 A successful Git branching model

使用這個方法,理論上正式釋出的版本都會在 master branch 裡面然後加上 tag。但在使用者不願意/不能夠做大版本升級,只能上小 patch 的情況下,如果釋出後的版本要繼續維護,就有機會遇到下面的問題。

假設 master branch 上有 1.0、1.1、1.2 這幾個版本。某一天發現有個 bug 在 1.1 這個版本開始就存在,所以需要回頭去更新 1.1 跟 1.2 把問題修掉然後釋出新版。可能的作法就是從這幾版 branch 出去,把 patch 放上去以後下新 tag 成為 1.1.1,1.2.1 這樣。

只是這樣做以後,就不是所有正式釋出的版本都存在 master,經常性存在的 branch 也不會只有 master 跟 develop,還會有這些有小 patch 的 branch。

既然很有可能要有這些 branch,最後選擇的解法就是只要釋出大版本就開 branch 出去,像是 release-1.1、release-1.2,要 patch 某個版本就直接到相對應 branch 去修改。

我自己的感覺是原本 git flow 的作法是把 release 這件事視為線性的,當現實狀況不是線性而是有分支而且分支還會成長的時候就不適用了,除了這點以外,文章其他部份還是很值得參考的。

April 03, 2013

[git] delete remote tag

2017/6/10 update
git push origin --delete mytag

--
git tag -d mytag
git push origin :refs/tags/mytag

March 28, 2013

[git] change author

git commit --amend --author "New Author Name < email >"

February 04, 2013

git blame

git blame deleted line (show the revision in which a line appeared)
  • git blame --reverse start..end -- file
git blame deleted file (give the revision in which file deleted)
  • git blame REVISION~ -- file

January 29, 2013

處理已經被砍掉的 remote branch

清掉全部已消失的 remote branch
  • git remote prune origin
清掉特定的 remote branch
  • git push origin --delete branch (2017/11 updated)
  • git branch -d -r origin/disappear-branch

August 04, 2011

gitolite + http mode + LDAP

gitolite 安裝
參考這邊,將 /var/www 改為想要放置 git repo 位置的目錄
cd /var/www/
mkdir gitolite-home
export GITOLITE_HTTP_HOME=/var/www/gitolite-home
PATH=$PATH:$GITOLITE_HTTP_HOME/bin
cd gitolite-home/
git clone git://github.com/sitaramc/gitolite gitolite-source
cd gitolite-source/
GHH=$GITOLITE_HTTP_HOME
mkdir -p $GHH/bin $GHH/share/gitolite/conf $GHH/share/gitolite/hooks
src/gl-system-install $GHH/bin $GHH/share/gitolite/conf $GHH/share/gitolite/hooks
vim /var/www/gitolite-home/share/gitolite/conf/example.gitolite.rc
gl-setup ADMIN的LDAP帳號
apache 設定
參考這邊,修改 auth 的部份為 LDAP
<LocationMatch "/git">
AuthType Basic
AuthName "Git"
Require valid-user

AuthBasicProvider ldap
AuthzLDAPAuthoritative off
AuthLDAPURL "ldap://server:389/dc=company,dc=local?sAMAccountName?sub?(objectclass=*)" NONE
AuthLDAPBindDN "cn=user,ou=team,ou=department,dc=company,dc=local"
AuthLDAPBindPassword secret
</LocationMatch>
設定gitolite
選擇以後要放設定檔的位置
  • git clone http://server/git/gitolite-admin
gitolite.conf 的設定說明,要新增 repo 或是要加入使用者設定都是在這個檔案修改,修改完成以後將 gitolite.conf 更新回 server
  • git add
  • git commit
  • git push origin master

July 28, 2011

git-http-backend on CentOS 5.5

from CentOS, Git & http-push unavailable

  • install new version curl in local directory
  • configure git as ./configure --with-curl=curl dir
apache settings from
  • git init --bare git-repo-dir (beware of the directory permission - httpd user writable)
  • git update-server-info
  • in /etc/httpd/conf/httpd.conf or /etc/httpd/conf.d/git.conf
SetEnv GIT_PROJECT_ROOT git-repo-dir
SetEnv GIT_HTTP_EXPORT_ALL
AliasMatch ^/git/(.*/objects/[0-9a-f]{2}/[0-9a-f]{38})$ /git-repo-dir/$1
AliasMatch ^/git/(.*/objects/pack/pack-[0-9a-f]{40}.(pack|idx))$ /git-repo-dir/$1
ScriptAliasMatch \
"(?x)^/git/(.*/(HEAD | \
info/refs | \
objects/(info/[^/]+ | \
[0-9a-f]{2}/[0-9a-f]{38} | \
pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
git-(upload|receive)-pack))$" \
/usr/local/libexec/git-core/git-http-backend/$1
ScriptAlias /git/ /usr/local/share/gitweb/gitweb.cgi

<Directory "git-repo-dir">
Allow from all
</Directory>

<LocationMatch "/git">
AuthType Basic
AuthName "Git"
#AuthUserFile AuthFile
#Require valid-user

AuthBasicProvider ldap
AuthLDAPURL "ldap://server:389/dc=company,dc=local?sAMAccountName?sub?(objectclass=*)" NONE
AuthLDAPBindDN "cn=user,ou=team,ou=department,dc=company,dc=local"
AuthLDAPBindPassword secret

AuthzLDAPAuthoritative on
require ldap-user user1 user2 user3
</LocationMatch>

auth
  • git clone http://server/git-repo-dir
  • git clone http://username@server/git-repo-dir
  • git clone http://username:password@server/git-repo-dir
  • unset SSH_ASKPASS

June 03, 2011

Git 筆記 II

  • git rm --cached file
    remove the file from stage area but keep the file in working area

January 16, 2009

安裝 git 跟 git svn

想來試試看 git,沒想到從安裝就不斷的遇到困難,記錄一下,下面都是用 git svn 抓某份有 16xxx 版的 source 來測試。

  • Windows(2000) 上 cygwin 有 git 可以直接裝,另外要裝 subversion-perl
    • 遇到中文檔名出問題,導致 clone 不成功
    • 速度很慢,原因不明
      (我都要放著抓一整天才能抓完,然後第一次抓不小心重開機,結果就沒看到因為中文檔名導致clone失敗的訊息,隔天整天搞不懂為什麼不能用弄了好久 -____-)
  • 在工作的unix server上用一般使用者的身分安裝
    • 裝 subversion (要裝apr, apr-util, neon)
    • 參考了這個網址裝 svn 的 perl module,寫下來以防網站消失
      (這個步驟也搞了好久,網路上有很多說明,可是我都試不出來... )
      在 svn source 的目錄
      make swig-pl
      make check-swig-pl
      sudo make install-swig-pl
      (把東西搬到 SVN/*.pm 跟 auto/SVN/_*/*.so *.bs 搬到特定位置去,那天弄到這邊已經完全失去耐心,用暴力解決 =_=)
總之就是... 可以開始用了 ~_~