Git 带有未提交更改的归档文件。

9

我正在制作自己的RPM包。通常情况下,我使用git archive从我感兴趣的提交或标签中获取tarball(假设我打了一个标签1.0):

git archive --format=tgz --prefix=product-1.0 1.0 > product-1.0.tgz

假设我现在正在进行一些本地开发,但还没有提交,我想获取一个存档;有没有办法在不提交的情况下获得存档?

编辑 我可以使用类似以下的方式:

tar cf product-1.0.tgz --exclude=.git

但这样会包括所有的二进制文件和其他未被跟踪的文件,我更倾向于不这样做...


1
你可以将你正在进行的工作放在一个本地分支中,该分支未被推送到仓库/不跟踪仓库上的分支。 - mah
如果使用npm可以的话,请查看gitzip。这将让你根据.gitignore压缩文件夹中的文件。只需在文件夹中运行gitzip即可。 - dkt
7个回答

11

我不确定这是否正是你想要的,但你可以使用git stash create暂存已经进行的更改,这将为您提供仓库当前状态的哈希值 - 然后使用git archive <options> $HASH创建一个归档。


那么我的存档将不包括我未暂存的更改,但是我想要它们! - Chris Maes
2
它应该为您提供包括未暂存更改但不包括未提交文件的存储库。如果您也需要这些文件,那么您需要找到另一种方法。 - Lewis Eason
一个小提示:每次运行该命令都会创建一个新的哈希。 - Samveen

10
git ls-files | tar Tzcf - archive.tgz

5

当您有未暂存的更改时,您可以尝试使用 git difftarzip 命令。

tar 命令:

git diff --name-only -a | tar Tzcf - myUnstagedChanges.tgz

zip 命令:

git diff --name-only -a | xargs zip myUnstagedChanges.zip

此外,如果您需要针对提交执行此操作,请尝试使用 git show [idCommit] 命令。
git show --pretty="" 9471ae --name-only -a | tar Tzcf - myCommitedChanges.tgz

或者

git show --pretty="" 9471ae --name-only -a | xargs zip myCommitedChanges.zip

压缩文件归档将会创建到git根目录。

希望我有所帮助。


谢谢您的尝试,但这并不是问题的答案:问题是如何压缩整个存储库,并包括未暂存的更改;而不仅仅是未暂存的更改。 - Chris Maes

1
创建一个名为archive的分支,将我想要跟踪的文件添加并提交,除了已经在Git中跟踪的文件外,还包括你当前未跟踪的开发文件、生成的文档、未在Git中跟踪但需要归档的二进制文件等。
当这些本地提交后,现在可以使用以下命令:
git archive archive --format=tgz --prefix=product-1.0 1.0 > product-1.0.tgz
请注意,第一个“archive”是命令,第二个是分支名称。
现在撤销最后一次提交,以便这些文件再次变为未跟踪状态:
git reset --soft HEAD~; git reset
切换回master并删除archive分支。

谢谢回答。那个方法可以行得通,但需要比前两个答案更多的工作量... - Chris Maes

1

抱歉,这不是实际答案。

可能有一些方法,但实际上我认为没有太大意义。提交很轻松。提交完全临时或损坏的文件没有问题。在推送到公共仓库之前,这都是您的本地存储。只需创建一个新分支,对其进行提交,然后在某个时间点删除该分支,甚至可以立即删除。唯一需要注意的是不要将该分支推送到公共仓库。其中最大的优点是,在提交过程中,您将能够选择性地选择要包含的文件。它将允许您过滤掉任何不需要的二进制文件、归档文件等-并且非常详细。这确实比尝试通过bash和类似工具进行过滤要更加可用。

所以,对于我来说,如果您正在构建软件包,那么你真的需要提交代码。因为在未来的某个时间点,您将需要检查原始文件或还原到该状态。这正是分支和整个代码库的作用:标记并记住某些文件的某种状态。代码库不仅仅用于存储“发布代码”,它是为了保留任何时候您需要的所有相关内容,以及与之前完全相同的状态。
因此,我甚至推荐为这些构建/打包使用真正的分支。而不要使用stash。stash只是暂时的东西,很快就会消失。您可以获得一个哈希值,但您可以非常轻松地删除整个分支/藏匿/版本。这会完全摧毁版本控制的本质。您将把它放入git中,但却将其删除。
通过使用普通分支和普通提交,您将能够在未来的任何时候查看或重新创建您在历史上任何时候构建过的任何RPM软件包,我认为这是巨大的优势。

我使用SourceTree,它可以很好地显示未暂存更改中的所有差异。我经常参考这个视图来查看自上次提交以来所做的确切更改,如果我提交了,那么我就无法再看到这些更改。我可以比较两个提交,但这不会显示未暂存的更改与两个提交之间的差异相结合。因此,获取关于我所做的确切更改的实时更新的唯一方法似乎是将更改保留为未暂存状态。这就是为什么我个人正在寻找一种用git bash备份未暂存更改的方法。 - J. Schei

0

对于未暂存的更改:

tar czvf product-1.0.tar.gz `git diff --name-only`

针对分阶段更改:

tar czvf product-1.0.tar.gz `git diff --cached --name-only`

但是这些只在同一文件中没有暂存部分和未暂存部分时才有效。


0
以下命令带有帮助
 git archive --output=modified-files.zip HEAD $(git ls-files --modified)

1
很抱歉,那并没有回答我的问题。我对所有文件感兴趣,而不仅仅是修改过的文件。 - Chris Maes
该命令将所有修改的文件(包括未跟踪和忽略的文件,但不包括已提交的文件)压缩成一个zip包: git status --porcelain --untracked-files=all --ignored | cut -c4- | sort -u | zip modified.zip - Night Train

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接