如何使用git服务器端钩子与gitlab更改提交的内容

时间:2014-12-17 03:55:22

标签: git gitlab

我已经在ubuntu 12.04上安装了gitlab(手动)。

有一些包含PSD的存储库(Adobe photoshop文件)。 我们希望实现的是,每当有人将提交推送到gitlab服务器时,它将自动执行:

  1. 将PSD转换为PNG
  2. 将PSD移至Dropbox(或其他云端存储)
  3. 从提交中删除PSD
  4. 将PNG添加到提交
  5. 注意:第2步与此问题无关。

    无论如何,我们设法下载了将PSD转换为PNG的工具,包括安装Ruby,一些Ruby Gems和PSD.rb(Google PSD.rb,如果有人有兴趣的话)

    问题是我们不希望在客户端管理安装(Ruby,gems等),因为我们假设我们很难在许多windows,mac和linux机器上维护安装

    所以我们希望实现的是当有人进行git push并且提交中有PSD文件时,上面的内容将在服务器端钩子中执行。

    我们已尝试在预接收挂钩中执行此操作,但我们无法修改提交内容(例如,从提交中删除PSD,将新文件 - PNG添加到提交中)

    在服务器端有没有其他方法可以执行上述操作?或者我们可以探索其他方法吗?

2 个答案:

答案 0 :(得分:3)

您无法修改提交。

您可以拒绝提交,并且在完成此操作后,您可以根据收到的内容进行新的不同的提交。

也就是说,你拿走你收到的东西,把它保存在别的地方,拒绝提交,然后拿出保存的东西,做出你的改变,然后做出新的提交。对于试图推送某些东西的用户来说,看起来他们的提交被拒绝了,然后其他人(打字速度非常快)做了他们所做的所有相同的工作,但随后清理了它并提交了一个略有不同的版本阅读"拒绝"消息。

请注意,我并不是特别推荐这个想法,也不会写代码来实现它,但它应该可以正常工作。

您还可以使用不同的两步法,其中涉及两个不同的服务器:

  • 服务器"纯粹"仅提供PNG内容,不会从用户那里推送
  • 服务器"转换器"从用户那里得到推动,接受它们(这里没有拒绝),然后清理它们并将清理后的版本推送到"纯粹的"

用户因此从" pure"中读取项目,写入内容,将其推送到"转换器",然后从" pure"获取更新的(不同的)提交并丢弃他们的"不清洁",未转换的提交。

这与第一个系统的过程完全相同,只是它对每个人的工作方式都比较明显,用户必须知道如何从"纯粹的"并推送到#34;转换器"。在第一个系统中,单个git存储库和机器同时充当" pure" (当提供清理过的东西时)和"转换器" (当接收并秘密保存但随后拒绝推送时)。

答案 1 :(得分:0)

重写服务器上的提交是一个坏主意,原因与重写历史相同。

另一种选择是设置git-annexdropboxannex以便在投放箱上存储PSD。

服务器提交挂钩可以拒绝任何具有非git-annex -ED PSD的推送。 在客户端上,预提交挂钩可以自动将PSD添加到git-annex