Bitbucket 外部挂钩,如何重建 git 存储库的文件夹结构?

Bitbucket external hook, how do I reconstruct the folder structure of the git repo?

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

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

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

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

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

服务器上的 git 存储库是 bare repo。它没有工作目录(你所谓的 "branch",似乎),并且没有文件被检出。

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

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

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

您可以使用 Docker Hub or something else that's integrated with Bitbucket for easy setup, or perhaps even Atlassian's own continuous integration tool, Bamboo.

我想出了怎么做,这花了我几天时间,我不得不复制我同事写的 ruby 脚本的功能来做到这一点。脚本 运行 超过 200 行,所以我不会把它放在这里,但总结一下我需要做的事情:

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

一旦我有了它,我就可以检查在当前提交时更改的每个文件的全部内容。