首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Git中创建只包含特定提交文件的基线

如何在Git中创建只包含特定提交文件的基线
EN

Stack Overflow用户
提问于 2019-09-10 13:48:56
回答 1查看 5K关注 0票数 1

在ClearCase中,我们能够创建一个标记基线,其中只包含由ClearQuest管理的特定更改请求修改的二进制文件。作为参考,我们正在使用Jira做同样的事情,与自定义集成。问题是如何使用特定的提交哈希列表引用的文件版本创建Git分支,然后只将这些文件存档到基线.zip文件中。

我们公司正在从ClearCase迁移到Git。我们处理的代码不是传统的基于文本的源代码。它包含在由专有供应商软件创建的二进制对象中,通常是其他二进制文件的.zip存档。我们将二进制对象存储为Git对象。因为我们处理的是二进制文件,所以不执行合并。我们使用LFS锁来保证对文件的单一访问并防止合并的需要。我们的程序员也不使用命令行接口,比如bash。对他们来说,处理“文件”的更新就是签出、更改、签入。Git模式的锁、拉、编辑、添加、提交、解锁超出了它们的能力范围。为了维护ClearCase签出/签入范例,创建了许多包装脚本,这些脚本向程序员隐藏了Git细节。这些脚本从上下文菜单命令中调用。

话虽如此,但请不要回应我们滥用Git。它是一个复杂的工具,并不适合所有的编程环境。然而,Git是目前最流行的版本控制工具。我们已经能够保留我们的程序员熟悉的所有ClearCase接口功能。

程序员不使用分支。我们只保留一个主支行。每个包装器命令都会拉出并推送到源主分支。添加、删除或签入的每个文件都是在单独提交下完成的。

以下步骤不是由典型的程序员执行的,而是由Git管理员执行的。

目前,我们:

  1. 创建并签出分支
  2. 为特定提交创建散列列表
  3. 在分支中执行git rm -rf .以消除所有内容
  4. 尝试执行以下每项操作,只填充我们想要的文件/提交( )
    • a.每一个散列的结帐
    • b.每个散列的lfs签出
    • c.使用版本字符串创建标记(例如,v1.0)

  1. 将标签推入原点
  2. 签出-f母版以恢复原来的状态
  3. 使用版本字符串对zip文件执行git存档。

不管我们做什么,git归档都希望在上次提交存档时将回购中的所有内容都包括在内。这就是第三步的原因。

我们尝试了一个步骤6.1,即只是压缩包含项目的文件夹。我们得到的只是.zip中的文件,这就是尝试步骤4- a、b、c的原因。

似乎我们正在执行许多步骤来完成一些简单的事情。我们有可能错过了显而易见的事情吗?有人能建议一种更直截了当的方法吗?回想一下,最终的.zip结果必须只包含特定提交修改的文件。

EN

回答 1

Stack Overflow用户

发布于 2019-09-10 16:01:41

我们的程序员也不使用命令行接口,比如bash。对他们来说,处理“文件”的更新就是签出、更改、签入。Git模式的锁、拉、编辑、添加、提交、解锁超出了它们的能力范围。为了维护ClearCase签出/签入范例,创建了许多包装脚本,这些脚本向程序员隐藏了Git细节。

你真是误入歧途..。

话虽如此,但请不要回应我们滥用Git。

糟了。不要紧。继续说吧。

程序员不使用分支。

那为什么要用Git呢?这个工具的所有成功都是基于在分支之间完成的拉/合并请求。

对于源代码(二进制文件通常在像Nexus这样的工件引用中发布/exported )

你好像滥用了G..。(啊,对,抓一下那个)

git archive希望在上次提交存档时将回购中的所有内容都包括在内。

这就是Git存储库的本质,它是快照(提交)的集合,每个快照都代表当时存储库的全部内容。

包含来自特定提交的文件

提交的意思是:所有的文件,而不仅仅是“修改的文件”。

我在“Single working branch with Git”中提到:

  • Git的内容管理性质
  • 但是,在您的情况下,这也可能是一个解决办法,它能够在多个文件夹中签出多个分支/提交(有点像带有自己的配置规范的多个快照视图)。

使用 command,您可以轻松地签出

这就是:

代码语言:javascript
复制
git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | tar -czf file.tgz -T -

如果您想使用 only

代码语言:javascript
复制
git archive -o patch.zip a9359f9 $(git diff --name-only a9359f9^..a9359f9)

(用自己的提交id替换a9359f9 )

在后一种情况下,您甚至可以跳过我前面提到的额外结帐。

OP gitrdone confirms

我不知道git diff-tree --diff-filter=ACMRT选项。有了这一点和普遍的洞察力,它现在正在按我的意愿工作。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57872255

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档