具有未提交更改的存储库的 Git 存档

Posted

技术标签:

【中文标题】具有未提交更改的存储库的 Git 存档【英文标题】:Git archive of repository with uncommitted changes 【发布时间】:2010-05-04 15:21:42 【问题描述】:

如何使用git archive 创建当前存储库的存档,包括本地未提交的更改?

【问题讨论】:

【参考方案1】:

我知道这是旧的,但我想我找到了解决方案。

运行:

stashName=`git stash create`;
git archive <options> $stashName

由于 git 想要一个可靠的提交来制作存档,我们可以使用 git stash 进行“一次性”提交。 create 命令只是创建存储提交(不会重置您的工作目录或将其推送到存储堆栈)并返回它的哈希。

如果您担心悬空提交的空间,可以使用git gc --prune=now 清理它。否则,只需等待 2 周,它就会消失。

【讨论】:

现在它已经 7 岁了,仍然有用,谢谢@nevasn。我将它用作 Makefile 中的一个衬里:git archive &lt;options&gt; `git stash create` &lt;paths&gt;【参考方案2】:

为我的目的改进 nevsan 的答案 - 在任何情况下(已提交或未提交)存档最新代码:

uploadStash=`git stash create`; git archive -o code_outgoing.zip $uploadStash:-HEAD

【讨论】:

修复了一个错误:git stash create [now] 总是成功返回,并且当没有要存储的文件时不打印任何内容。使用 bash $var:-default 语法而不是依赖退出代码。 IIRC 有一个问题,它不会从存档中取出 git 删除的文件。 美丽。或者在使用提交之前分离 latest-or-head 逻辑:LATEST=`git stash create`; LATEST=$LATEST:-HEAD # use HEAD if no changes【参考方案3】:

git ls-files 的另一个解决方案:

git ls-files -z | xargs -0 tar -czvf archive.tar.gz

【讨论】:

在我看来,这是最好的答案。但是,我建议使用 ls-files 的 -z 选项和 xargs 的 -0(零)选项,以便正确处理带有空格的文件名: git ls-files -z | xargs -0 tar -czvf archive.tar.gz . 你完全正确!谢谢。我已将这些选项添加到命令行。 git ls-files | tar Tczf - archive.tar.gz 对单个命令的参数大小没有系统强加的限制。 xargs 不适用于您真正需要为所有内容运行一次的任何命令。【参考方案4】:

您不必再使用git stash 来创建一个包含您的跟踪更改的人工提交,以便git archive 进行操作。

在 Git 2.29(2020 年第四季度)中,“git archive(man) 学习了“--add-file”选项以将未跟踪的文件包含在树状快照中。

参见René Scharfe (rscharfe) 的commit df368fa、commit 2947a79、commit 200589a(2020 年 9 月 19 日)。(由 Junio C Hamano -- gitster -- 合并到 commit f6b06b4,2020 年 10 月 5 日)

archive:加--add-file

签字人:René Scharfe

允许用户附加未跟踪的文件。 这简化了带有一些额外文件的源包的生成,例如包含版本信息。 它们获得与跟踪文件相同的访问时间和用户信息。

git archive 现在包含在其man page 中:

--add-file=&lt;file&gt;

将未跟踪的文件添加到存档中。 可以重复添加多个文件。 存档中文件的路径是通过连接--prefix(如果有)的值和&lt;file&gt; 的基本名称来构建的。


我也喜欢Git 2.30 alternative to tar。

【讨论】:

【参考方案5】:

如果您尚未提交更改,那么git archive 将无济于事。如果您只想要工作区域的快照,tar 可能是您的最佳选择。

【讨论】:

【参考方案6】:

这将创建一个 zip 存档,其中包含所有工作树文件,除了那些被 git 忽略的文件:

git ls-files --others --exclude-standard --cached  | zip --names-stdin archive.zip

【讨论】:

【参考方案7】:

我正在使用此命令将指定版本导出到现在(包括取消提交更改文件)更改一行

git archive -o /path/to/save/temp.zip $(git stash create) $(git diff --name-only xxx_version_to_start)

【讨论】:

【参考方案8】:

git ls-files 是首选,因为它不需要创建任何提交对象。

git ls-files --recurse-submodules -z | tar --null -T - -czvf output.tar.gz
# git ls-files
#   --recurse-submocules
#   -z, split output lines with null
# tar
#  -T -, read files from stdin

【讨论】:

【参考方案9】:

一个基于@fhucho's answer的小型bash脚本:

#backup.sh
#remove final "/"
repo=$1%"/" 
#create $repo-backup.zip
cd $repo
git ls-files --others --exclude-standard --cached  | zip --names-stdin ../$repo-backup.zip
cd ..
ls -l $repo-backup.zip

用法:

. backup.sh myrepo

【讨论】:

以上是关于具有未提交更改的存储库的 Git 存档的主要内容,如果未能解决你的问题,请参考以下文章

更改 Git/GitHub 存储库的作者姓名和电子邮件,为所有提交保留时间戳

列出未推送更改的 git 存储库

我是否可以拉出远程Git存储库并获得远程(未提交的)工作更改?

git:比较更改

如何处理未提交的更改

如何使用 git reset 在不丢失本地更改的情况下重置未推送的提交