git - 如何将未更改的文件添加到 git 索引

标签 git jgit

我正在编写一个工具,它必须在 Git 存储库中保留(生成的)文件的历史记录。

其中一个要求是我必须能够获取在特定提交中生成的任何内容,并将它们重播到另一个分支中。

从表面上看,它看起来非常像 cherry-pick ,但有些细微差别使它有点不同。

每次提交都会在工作树中生成一组文件。一些文件可能已经存在于工作树中,而且生成的内容通常与工作树中的版本没有变化。

在稍后的某个时间,我必须能够获取为上一次提交生成的文件列表(无论内容是否更改)并将它们复制到另一个分支。

我的第一个问题是:我可以将文件添加到 git 索引(并最终提交),即使它的内容没有改变吗?

如果我为此不得不处理 git 内部结构,那也没关系。 我只需要确保它不会破坏其他 git 工具的 git repo。

我正在使用 Java 和开源 jGit 库与 Git 存储库交互,所以我的第二个问题是,这在 jGit 中是否可行

如果是,那么一些 API 指针将不胜感激。

谢谢。

最佳答案

要回答您的明确问题 - 如果您之前的提交中存在一个文件,并且其内容根本没有改变(尽管它的元数据可能有),那么该文件已经在索引中。提交后,索引立即包含该提交的确切内容。添加/删除更改对索引进行适当的修改,为下一次提交做准备。与其他几个答案/评论相反,git不存储更改 - 它存储工作目录的完整快照(或者至少是它的未忽略、未跟踪的部分)。它会在您要求时计算更改,但不会存储它们(至少从git 前端的角度来看 - 底层对象数据库将使用增量来减少所需的空间量,但它使用的增量可能不在文件的连续版本之间,如果文件非常相似,甚至可能不在同一文件的两个版本之间。

要回答听起来您想要做什么,您可能需要研究 git reset --merge .如果这不是你想要的,你可以做这样的事情,这将更改当前工作目录以匹配特定提交,然后将该状态提交为新提交 - 本质上是复制源提交表示的快照,即可能在不同的分支上,或者可能在当前分支的更早部分,并进行一个看起来像它的新提交,除了被认为是父提交的内容:

git rm -r *
git archive --format=tar <commit> | tar xpf -
git add -A .
git commit -m "snapshot copy of commit <commit>"

你可以使用 git archive --format=zip <commit> -o /tmp/somefile.zip; unzip /tmp/somefile.zip同样,但我更喜欢使用 tar格式,因为您可以通过管道传输它...

关于git - 如何将未更改的文件添加到 git 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23696267/

相关文章:

来自 GitHub RPC 的 git clone 失败;结果=56,HTTP 代码

git - 如何使用 Git 获取两个日期之间发生的所有提交之间的差异?

java - 如何使用 JGit 执行 "git filter-branch --subdirectory <folderName>"

java - 如何使用 jgit 库将 git HEAD 指向特定的 ref?

svn - merge 到 git 后 git-svn dcommit 危险吗?

git - 如何将新的本地分支推送到远程 Git 存储库并跟踪它?

git - git 输出的 "+1/-1"是什么意思?

java - 当文件包含错误时是否可以拒绝 egit 提交

java - 如何在 JGit 中执行 git log --no-walk --tags

java - 如何使用 JGit 检查 Git 克隆是否已经完成