我正在编写一个工具,必须将(生成的)文件的历史保存在Git存储库中。
其中一个请求是我必须能够获取在特定提交中生成的任何内容并将其重放到另一个分支中。
从表面上看,它看起来非常像樱桃采摘,但有一些细微差别使这有点不同。
每次提交都会在工作树中生成一组文件。某些文件可能已存在于工作树中,并且通常,生成的内容与工作树中的版本保持不变。
稍后,我必须能够获取为先前提交生成的文件列表(无论内容是否已更改)并将其复制到另一个分支。
我的第一个问题是:我可以将文件添加到git index(并最终提交),即使其内容没有更改吗?
如果我不得不为git internals捣乱,那还可以。 我只需要确保它不会破坏其他git工具的git repo。
我正在使用Java和开源jGit库与Git存储库进行交互,所以我的第二个问题是,如果在jGit中这是可能的
如果是,那么一些API指针将不胜感激。
感谢。
答案 0 :(得分:3)
要回答您的明确问题 - 如果您之前的提交中存在文件,并且其内容根本没有更改(尽管其元数据可能有),则该文件已在索引中。提交后,索引会立即包含该提交的确切内容。添加/删除更改会对索引进行适当的修改,以准备下一次提交。与其他几个答案/评论相反,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
格式,因为你可以管它......
答案 1 :(得分:1)
似乎git update-index
专门用于操纵索引。您应该在its documentation中找到所需内容。
答案 2 :(得分:1)
Git存储更改而不是文件。你最好使用更适合文件存储和时间戳(数据库)然后版本控制的东西。
为了强制在git中做你想做的事情,我唯一能想到的就是让生成器为文件添加内部版本号或唯一的MD5 +种子(time.now),以便git看到改变它然后可以提交。
但是这真的闻起来像解决方案不符合问题。您是否绝对确定使用版本控制系统来记录生成器脚本的运行是否适合该工作?
答案 3 :(得分:1)
首先,我必须同意git
很可能不是正确的方法。
这个答案的其余部分介于实验和丑陋的黑客世界之间。
我们想到的是在您的存储库中放置一个文件,其中包含您的文件&#39;例如repo_files
内的结构。
然后,您可以实现一个钩子,将新文件添加到repo_files
。
因此,您可以随时了解回购加上您需要的空文件。
通过这些实现,您可以编写一些自定义git命令来执行您需要的操作
例如:
generate_repo_files
文件的repo_files
commit_empty_file
只会将文件添加到repo_files
checkout_with_files
将执行结帐并触摸丢失的文件remove_files
将删除repo_files