具有未提交更改的存储库的 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 <options> `git stash create` <paths>
【参考方案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=<file>
将未跟踪的文件添加到存档中。 可以重复添加多个文件。 存档中文件的路径是通过连接
--prefix
(如果有)的值和<file>
的基本名称来构建的。
我也喜欢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 存储库的作者姓名和电子邮件,为所有提交保留时间戳