如何在竹子构建期间仅检查 git 存储库的一部分?

Posted

技术标签:

【中文标题】如何在竹子构建期间仅检查 git 存储库的一部分?【英文标题】:How can I check out only a part of a git repository during a bamboo build? 【发布时间】:2012-05-04 22:37:56 【问题描述】:

我有一个竹子构建,需要访问一个大型 git 存储库的一小部分。为了节省时间和磁盘空间,我只想检查与构建相关的存储库部分。我已经知道浅结账。我想做更多的事情,并将结帐限制为一个文件夹(及其后代)。

我看到了这个选项,我认为这是我必须使用的,但我无法让它工作:

如何进行所需的最少结帐?

【问题讨论】:

您在问题中显示的配置特定于“更改检测选项”,即它只会检测您使用的特定文件模式和包含/排除文件选项的更改,而不是检出。 【参考方案1】:

最简单的可能是让谁托管 repo 标签并提交您想要的特定树。例如,

在上游:

git tag quickie $(git commit-tree $(git rev-parse HEAD:path/to/dir) </dev/null)

你:

git fetch upstream quickie

如果您希望上游 repo 自动跟踪分支上的子树,您可以执行以下操作(适当的解密版本):

sed -n 's,^[^ ]* [^ ]* refs/heads/master$,git update-ref refs/heads/master-subtree -m "Auto-tracking master" $(git commit-tree master:subtree -m "Auto-tracking master subtree" $(test -r refs/heads/master-subtree \&\& echo -p refs/heads/master-subtree)),p' | sh -x

这比看起来简单。试试这个:

mkdir ~/tryitout && cd ~/tryitout && git init foo && git init bar --bare
cat >bar/hooks/post-receive <<'EOF'
sed -n 's,^[^ ]* [^ ]* refs/heads/master$,git update-ref refs/heads/master-subtree -m "Auto-tracking master" $(git commit-tree master:subtree -m "Auto-tracking master subtree" $(test -r refs/heads/master-subtree \&\& echo -p refs/heads/master-subtree)),p' | sh -x
EOF
chmod a+x bar/hooks/post-receive
cd foo
mkdir subtree && touch subtree/oooo && git add . && git commit -am-
git push ../bar master

后期更新 --

如果您要与其他 repo 共享文件系统,您可以这样做:

git clone --no-checkout /path/to/local/repo/.git subtree
cd subtree
git commit-tree origin/rev:subtree </dev/null | xargs git checkout -B peek

您可以通过将 rev 更改为适合、origin/master:include、origin/next:include、origin/v1.4:somewhereelsenow 等来随意反弹。

我通常有一个用于大型回购的“空”分支。 Git 确实处理空目录的一种特殊情况:

git mktree </dev/null | xargs git commit-tree | xargs git checkout -b empty

【讨论】:

但是,标签不需要维护吗?即,如果 repo 的相关部分发生更改,那么我们需要将更改挑选到标签中。还是我误会了? @AndrewEisenberg 对于要获取的任何内容,您都需要一个 ref。我将添加一行来展示如何使上游自动跟踪子树 感谢详细的解决方案。我试过了,它似乎工作。每次子树中发生相关更改时,我只需要记住推送。我会将您的问题标记为已接受,但我找到了解决问题的不同方法。由于存储库已经被第二个构建签出,第一个构建只是使用来自第二个构建的签出内容,使用完全限定的路径名​​。我对使用完整路径名并不十分满意,但这是最简单的方法,并且随着时间的推移最不容易中断。 好的,我没有看到你的另一个 repo 是本地的。你可以这样做: @AndrewEisenberg -- 好的,我没有看到您的其他存储库已经是本地的。当您可以为其进行硬链接克隆时,添加一种更简单的方法。

以上是关于如何在竹子构建期间仅检查 git 存储库的一部分?的主要内容,如果未能解决你的问题,请参考以下文章

竹子构建错误:如何正确清洁竹子缓存?

带有硒网络驱动程序的竹子

如何一次检查所有 git 存储库的状态?

如何检查远程 git 存储库的配置?

如何仅将 git 存储库的子目录部署/推送到 Heroku?

bitbucket 上的拉取请求不会触发竹子上的构建