git - 将更改和添加的文件从没有工作树的裸存储库导出到目录以进行编译或部署

标签 git git-diff git-archive

我有一个裸存储库,开发人员可以将其修补程序分支从 Windows 上的本地存储库推送到该存储库。当分支被推送时,我触发一个钩子(Hook)来在 Linux 上构建他们的更改。如果我为分支创建一个工作树,这很容易做到。然而,存储库包含数十个或数千个文件,并且当每个开发人员的修补程序分支仅向少数对象提交更改时,他们为所有对象创建一个工作树,这会浪费大量时间并消耗文件系统。

有没有办法让开发人员推送到裸存储库,然后在钩子(Hook)中仅将更改的源提取到目录结构,以便我可以进行高效的构建过程?

想法?

示例developer_a将其从Dev分支分支出来的HF1分支推送回Linux构建服务器上的远程裸存储库。

在钩子(Hook)中,如果我对 HF1 和 dev 分支执行“git diff”,我可以看到已更改的文件列表。

diff-tree -r --no-commit-id --name-only HF1..dev

/APP/SOURCE/Program1.cbl

在上述命令中使用该文件的任何尝试都会失败,因为工作树不存在。

我想生成此差异,然后直接从存储库中将差异中列出的文件提取到目标目录。

最佳答案

I'd like to generate this diff and then extract directly from the repo the files listed in the diff to a target directory.

这听起来就像 Git 在检查已设置为给定提交的工作树中的分支时本地已经在做的事情。

如果您构建的工作树处于某个提交,该钩子(Hook)可以触发推送的新 SHA1 的 git checkout:工作树将检测更改并更新自身(通过 post-receive 钩子(Hook)触发的 git checkout)仅更新需要的内容。

关于git - 将更改和添加的文件从没有工作树的裸存储库导出到目录以进行编译或部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55769065/

相关文章:

git - 将所有提交导出到 ZIP 文件或目录中

git - 从所有分支和标签中完全删除 git 存储库对象并将更改推送到远程

git - 在公开共享的分支上 git reset --HARD 的后果?

Git diff 不显示新添加文件的更改

git - 我如何使用 git diff -G?

svn - 我如何调整我的 svn :externals strategy to git submodules?

Git rebase 和 merge 符号链接(symbolic link)问题

git - 我可以让 git add -p 显示像 git diff --word-diff 这样的更改吗?

Git:从远程服务器获取特定修订