2012/09/14

git命令之update-ref

得空说说git update-ref。该命令用来更新ref引用的object。比如在一个bare repo里更新某个分支指向的提交。
命令用法如下:
git update-ref [-m <reason>] (-d <ref> [<oldvalue>] | [--no-deref] <ref> <newvalue> [<oldvalue>])

当带2个参数使用git update-ref时,会把赋给。同时它会解析遇到ref引用。(比如HEAD就是指向refs/heads/master的引用,更新HEAD实际上是更新refs/heads/master)。

当带3个参数使用时,在赋值之前会检查的当前值是否为。只有这个检查结果为真时,才会实际执行赋值操作。你可以利用这个特性,通过将设置为40个"0"或者一个空字符串来确保创建一个全新的ref。

如果使用--no-deref参数,update-ref会直接更新而不会解析相关的ref引用。

通常情况下,你应该使用更安全的:
git update-ref HEAD "$head"

而不是直接修改HEAD文件内容:
echo "$head" > "$GIT_DIR/HEAD"

2012/09/03

快速搭建SmartHTTP Git服务器

首先确保Git version >= 1.6.6并正确安装了Apache 2.x。

打开Apache配置文件,启用git-http-backend脚本:
SetEnv GIT_PROJECT_ROOT /path/to/repo
SetEnv GIT_HTTP_EXPORT_ALL
ScriptAlias /git/ /usr/lib/git-core/git-http-backend/

接着你就可以到/path/to/repo路径下创建你的Git仓库了。你可以使用git clone http://localhost/git/xxx.git来clone新创建的repo,但是并不能push。

要启用push需要添加认证:
<LocationMatch "^/git/.*/git-receive-pack$">
AuthType Basic
AuthName "Git Access"
Require group committers
...
</LocationMatch>

这样就可以通过匿名clone,认证push的方式使用Git服务器了。

更为细致的配置请参考git-http-backend文档

[GIT] 忽略已经被Git track的文件

我们知道在Git中忽略文件可以使用.gitignore文件或者配置.git/info/exclude。但是这两种方案有一个共同的限制,那就是只能忽略尚未被git track的文件。对那些已经执行过git add的文件就爱莫能助了。

下面介绍2个命令来实现对已经track文件的忽略。
git update-index --assume-unchanged -- path/to/file      # 启用忽略
git update-index --no-assume-unchanged -- path/to/file   # 停用忽略

示例如下:
77 gewang@LM-SHC-00355679@13:15:19:~/test/123
=> git diff
diff --git a/f b/f
index 541d3ff..847939a 100644
--- a/f
+++ b/f
@@ -5,3 +5,4 @@ abcaaa
aaa
dfadfaa
dlfaldf
+#####
78 gewang@LM-SHC-00355679@13:15:22:~/test/123
=> git update-index --assume-unchanged f
79 gewang@LM-SHC-00355679@13:15:36:~/test/123
=> git diff
80 gewang@LM-SHC-00355679@13:15:39:~/test/123
=> git status -s
81 gewang@LM-SHC-00355679@13:15:43:~/test/123
=> echo '-------' >> f
82 gewang@LM-SHC-00355679@13:16:04:~/test/123
=> git diff f
83 gewang@LM-SHC-00355679@13:16:06:~/test/123
=> git status -s
84 gewang@LM-SHC-00355679@13:16:14:~/test/123
=> git update-index --no-assume-unchanged f
85 gewang@LM-SHC-00355679@13:17:50:~/test/123
=> git diff
diff --git a/f b/f
index 541d3ff..6b239cf 100644
--- a/f
+++ b/f
@@ -5,3 +5,5 @@ abcaaa
aaa
dfadfaa
dlfaldf
+#####
+-------