2010-01-13 63 views
15

的我正在考虑从颠覆与git迁移。我们使用Subversion为我们的系统管理员管理配置文件之类的东西之一。为此,我们将$URL$放入每个文件中,该文件展开到颠覆树中文件的位置。这可以让管理员查看某个任意主机上的文件,并找出它来自哪棵树的哪个位置。

我能找到的最接近的模拟是gitattributes。有filter=指令,但似乎git没有向过滤器传递它正在过滤的文件名,这将需要将$URL$转换为路径。

还有ident指令,它会将$Id$转换为blob散列。如果可以将其映射回路径名,这可能是可用的,但是我的git-fu不够强大。

有什么建议吗?

的工作流程如下:

  1. 管理员提交更改VCS回购
  2. 管理员更新已签出的回购
  3. 联系拉更改使用的cfengine
  4. 主机的中央位置
+0

当你说路径,则它主要用来识别一个分支或分支内的实际路径? – 2010-01-13 20:50:25

+0

我的意思是文件的路径名。所以如果一个管理员查看'/ etc/apache2/sites-available/trac'文件,他会发现他可以在VCS中找到这个文件为'https://eng.svn.pdaverticals.com/trunk/net/HTTP/Apache2的/网站/ trac'。否则,他必须找到并且希望文件名匹配,它可能不匹配,因为有些文件在发送到主机时会得到不同的名称,有些文件是由大量不同的文件碎片组成的,甚至在VCS中也有一个模拟器。 – Rudedog 2010-01-13 23:01:30

回答

6

"Does git have anything like svn propset svn:keywords or pre-/post-commit hooks?"提到的,GIT中不支持关键字扩展。

Dealing with SVN keyword expansion with git-sv”提供了一个基于git config filter(这不完全是你想要的)和/或gitattributes的解决方案。


如果文件信息扩展我发现它仍然基于涂抹/清洁方法,with this git Hash filter,但干净的部分从文件中删除,而没有一条路可以找到的最接近的例子。

This thread实际上阐明它(以及提一些混帐福命令可能包含你正在寻找什么,我没有测试过):

不管怎样,涂抹/清洁不给立即解决问题,因为更小的技术缺陷:

  • 涂抹过滤器未通过文件的名称被检查出来,所以这是不可能准确找到承诺标识符。
    然而,这是一个事实,即“涂抹”只被运行修改过的文件,所以最后提交所需要的一个缓解。

  • 污迹滤波器不通过提交标识符。这有点严重,因为这些信息无处可逃。
    我试图用“HEAD”价值,但显然还没有在此刻“涂抹”更新正在运行,因此文件结束了的“上一个”日提交,而不是提交被检查出来。
    “Previous”表示之前签出的提交。如果不同的分支正在结帐,问题会变得更糟,因为这些文件会获得先前分支的时间戳。

AFAIR,缺少污迹过滤器中的信息是故意的,以阻止这种特殊的污迹/清洁机制的使用。不过,考虑到Peter的用例,我认为可以重新考虑这一点:“仅限结账”工作区,用于立即发布到网络服务器。
或者,对此用例感兴趣的任何人都可以将附加的涂抹参数作为站点本地修补程序实施。

然后,有一些小的烦恼,这似乎是不可避免的:如果您更改'干净'的过滤器并检查出早期版本,它会被报告为有修改(由于更改'干净'的定义)。

+0

我已经阅读并打折了前两个链接,因为他们都没有做我正在寻找的东西。我也知道gitattributes,我认为我已经通过我在文章中引用它们的事实表明了这一点。 – Rudedog 2010-01-13 20:03:18

2

从完全不同的角度来看这个问题,最终主机上的文件如何结束?我想现在它会直接在那里检查出来,或者以某种方式从另一个主机上已经检出的存储库中复制出来?

如果是这样,你可以修改你的过程,这样的文件签出到一个Git仓库,经过结账脚本执行$URL$或其他关键字扩展。这样你就可以做任何你喜欢的替换,并且只受限于在检出的存储库中通过脚本可以发现的内容。

+0

+1。更接近我所知道的生产环境:您不希望终端主机上有任何VCS工具。中间环境更安全。 – VonC 2010-01-13 22:03:21

+1

我们拥有一个拥有VCS只读结账的主管理员服务器。我考虑过在结账后做编辑,但问题是git认为所有的文件都被修改了,随后的git pull会失败。 我也想过使用git-archive刷新中央临时区域,但这会导致文件时间戳等变化的各种问题。 – Rudedog 2010-01-13 22:57:28

+1

我同意,这不是最优的。它可以工作,通过做一些接近'git reset --hard; git pull;替代品;部署文件“,但仍然不是你想要的。 :) – 2010-01-14 09:14:32

1

我们在部署中使用“规范路径”解决方案(它们都是内部FWIW)。

所有软件都进入例如/d/sw/xyz/a.cd:\ SW \ XYZ \交流转换器

所有URL到展开文件反映例如http://host/d/sw/xyz/a.c

存储库文件的URL以“sw”开头。 的git:// githost/gitrepo/XYZ/AC

我们在编码的配置(它应该永远需要改变),这些规范的路径,我们有脚本/ API,这些API生成/参考上飞的网址组件之间的动态链接。

4

由于时下有%f选项,像git-rcs-keywords这样的脚本可以完成这项任务。

它已在this answer中提及。

gitattributes(5) manpage

Sequence "%f" on the filter command line is replaced with 
the name of the file the filter is working on. A filter 
might use this in keyword substitution. For example: 

[filter "p4"] 
    clean = git-p4-filter --clean %f 
    smudge = git-p4-filter --smudge %f 
+0

现在,git过滤器应该启动更多的git命令来希望提取一些信息(并且提交哈希将不可能提取)git已经有了......这是真正加速的东西......它不是更好的是后分支的钩子:-( – 2013-02-14 09:54:50