1

git archive命令 - 有没有一种方法可以在不提交的情况下从 repo 创建一个 tarball?本质上,我只想创建现有文件的压缩包(更重要的是尊重 gitignore)。我假设 git archive 正在寻找提交 - 但我只想要代码的快照,即使是未提交的更改。

另一种方法是编写一个程序,它将所有文件 tar 并忽略 gitignore 中的内容,但这需要编写该程序。

4

3 回答 3

2

git archive需要使用树状结构,这意味着您需要树、提交或标记。没有什么可以阻止您创建一个临时分支并使用您想要的内容进行提交并将其存档。

或者,如果您确定不关心被忽略的文件,您可以运行git clean -dffx并使用它tar --exclude-vcs来打包您的存档。您也可以跳过git clean调用并尝试tar --exclude-vcs --exclude-vcs-ignores.

于 2019-05-03T22:48:35.243 回答
2

简单易行且明显正确的方法是:只需提交(如bk2204 建议的那样)。

但是,由于git archive需要 a <tree-ish>,您可以在不提交的情况下执行此操作。只需将树作为提交的一部分,即实际提交的一半(或更多),然后使用它:

git archive [additional options] $(git write-tree)

这里的问题是现在git write-tree将写入索引中的任何内容。这意味着您需要将所有更新的文件添加到索引中,即使您不打算提交。如果您想获得额外的花哨,可以使用临时索引来做到这一点,但首先更容易add -u

git add -u
git archive [additional options] $(git write-tree)

无需自己进行提交即可将工作树文件放入提交的另一种方法是使用git stash来完成这项工作。这会将当前工作树写入新的提交。因此:

git stash push
git archive [additional options] refs/stash
git stash pop --index

会做这项工作,或多或少。less发生在没有东西可以存储的情况下,在这种情况下什么git stash push都不做,你不应该运行git stash pop. 在这种特殊情况下,您可以存档——但检测是否做了任何事情HEAD很烦人。git stash push您可以添加更多的脚本层来处理这个问题,但实际上,现在提交有什么问题?

于 2019-05-04T00:52:29.283 回答
1

除了提交之外,请考虑git bundle:它就像git archive......但有历史。

你得到一个文件(一个捆绑文件),你可以复制它,然后从中克隆回来。
有关更多信息,请参阅“完全备份 git 存储库? ”。

于 2019-05-04T04:42:08.333 回答