【问题标题】:Bitbucket external hook, how do I reconstruct the folder structure of the git repo?Bitbucket外部钩子,如何重建git repo的文件夹结构?
【发布时间】:2016-10-29 18:12:22
【问题描述】:

我编写了一个 python 检查,它在文件夹中查找(盐状态)sls 文件,并检查重复项,因为如果您不捕获它们,它们会导致奇怪的错误。如果我在本地 git repo 中运行该脚本,它可以正常工作,但我想将它作为服务器上的外部挂钩运行,这样我就可以对任何进行提交的人强制执行规则(而不仅仅是将它们放在 .git/hooks 中)文件夹并要求其他人使用它们并希望他们这样做)。使用这个plugin,您可以将连接设置为在服务器上运行,但是当我在服务器上运行检查时它不起作用,因为文件夹结构不像我在本地拥有的分支,它是一个 git 服务器所以我们有:

['packed-refs', 'description', 'stash-refs', 'refs', 'branches', 'config', 'FETCH_HEAD', 'HEAD', 'objects', 'info', 'hooks', '.mailmap.new', 'logs']

我问了一位同事,他提到他用另一种语言(perl 或 ruby​​)编写了一个脚本,该脚本获取服务器上文件夹的内容,并使用它在分支中构建文件以运行测试。

我正在尝试找出如何在 python 中执行此操作,或者是否有更好的方法来解决这个问题,我还没有考虑过。

我四处搜索,但我发现很难在搜索中描述该过程!

【问题讨论】:

    标签: python git bitbucket-server


    【解决方案1】:

    服务器上的 git 存储库是 bare repo。它没有工作目录(似乎是你所谓的“分支”),也没有文件被检出。

    您看到不同目录结构的原因是因为在裸存储库中,通常位于 .git 子目录中的元数据文件仅位于主存储库目录中。将上面的结构与您本地的repository/.git 目录的内容进行比较,您会看到。

    您似乎正在使用 Bitbucket Server(仅基于您问题上的标签),因此您无法在此处进行更改。您可以在 Bitbucket 上运行的钩子只能基于 git 元数据执行操作,而不是基于 repo 的实际内容。

    您需要在某个地方设置一个构建服务器来自动测试您的存储库中的代码,然后在 Bitbucket 上安装挂钩,推送到此构建服务器并报告测试结果。

    您可以使用 Docker Hub 之类的东西或与 Bitbucket 集成的其他东西以便于设置,或者甚至可以使用 Atlassian 自己的持续集成工具 Bamboo

    【讨论】:

    • "你可以在 Bitbucket 上运行的钩子只能基于 git 元数据,而不是 repo 的实际内容。"可以,我刚写完脚本就可以了
    • @Rumbles 我现在看到了你的答案——是的,裸仓库中的 git 元数据包含仓库的状态,但没有工作目录。但是,我不确定您如何使用您的脚本在 Bitbucket 上“在分支中构建文件以运行测试”。但我很高兴它对你有用。
    • 检查我的答案,我在那里解释了这个过程,这有点难以理解,但是比我更聪明的人想出来了,它似乎有效。基本上,您可以在目录中运行 git 命令,并且使用 git show 您可以从裸仓库中检索文件,假设您知道引用和文件名
    • 是的,我知道并理解那部分,但在您最初的问题中,您询问了如何构建。这就是我提到构建服务器和 CI 的原因。不过没关系,你解决了你的问题真是太好了。
    • 在这种情况下,Build 与竹子无关 :)
    【解决方案2】:

    我想出了如何做到这一点,我花了几天时间,我不得不复制我同事编写的 ruby​​ 脚本的功能来做到这一点。脚本跑到 200 多行,所以我不会放在这里,而是总结一下我需要做的事情:

    • 获取传递给脚本的标准输入
    • 用空格分割,你有一个往返引用和用户推送的每个分支的分支名称(谁知道你可以一次推送多个分支?)
    • 对于每一个,检查它是新分支还是已删除分支,因为它们是特殊情况
    • 否则使用git show-ref --heads 获取每个分支的引用
    • 使用git log --format="%H" [to_ref] 获取以前提交的引用
    • 检查以前提交的 refs 与每个分支的 refs 以找到提交开始的分支
    • 使用git diff --name-only [from_ref] [to_ref]获取已更改的文件列表
    • git show [to_ref]:[file_name]获取文件内容

    一旦我有了它,我就可以检查在当前提交中已更改的每个文件的完整内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-30
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 2020-04-09
      • 2015-01-15
      • 1970-01-01
      相关资源
      最近更新 更多