使用未提交的更改来存储存储库的存档

Ton*_*vel 17 git

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

小智 32

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

跑:

stashName=`git stash create`;
git archive <options> $stashName
Run Code Online (Sandbox Code Playgroud)

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

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

  • 现在它已经 7 岁了,但仍然有用,谢谢@nevasn。我将它用作 Makefile 中的一行: `git archive &lt;options&gt; \`git stash create\` &lt;paths&gt;` (2认同)

lah*_*n_j 14

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

uploadStash=`git stash create`; git archive -o code_outgoing.zip ${uploadStash:-HEAD}
Run Code Online (Sandbox Code Playgroud)

  • 修正了一个错误:git stash create [now]总是成功返回,并且在没有要存储的文件时不打印任何内容.使用bash $ {var:-default}语法而不是依赖退出代码. (4认同)

Via*_*art 7

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

git ls-files -z | xargs -0 tar -czvf archive.tar.gz
Run Code Online (Sandbox Code Playgroud)

  • 在我看来,这是最好的答案.但是,我建议使用ls-files的-z选项和xargs的-0(零)选项,以便正确处理带空格的文件名:git ls-files -z | xargs -0 tar -czvf archive.tar.gz. (2认同)
  • `git ls-files | tar Tczf - archive.tar.gz`对单个命令的args的大小没有系统强加的限制.xargs不适合任何你真正需要只为一切运行一次的命令. (2认同)

Von*_*onC 5

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

\n

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

\n

请参阅Ren\xc3\xa9 Scharfe ( )的提交 df368fa提交 2947a79提交 200589a(2020 年 9 月 19 日)。\n (由Junio C Hamano 合并 -- --提交 f6b06b4,2020 年 10 月 5 日)rscharfe
gitster

\n
\n

archive: 添加--add-file

\n

签署人:Ren\xc3\xa9 Scharfe

\n
\n
\n

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

\n
\n

git archive现在包含在其手册页中:

\n
\n

--add-file=<file>

\n

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

\n
\n
\n

我也喜欢Git 2.30 的 tar 替代品

\n
\n

在 Git 2.37(2022 年第 3 季度)之前,“ git archive --add-file=<path>man从路径中获取原始权限位,并在某些情况下传播到 zip 输出,而没有进行标准化,这已得到纠正(tar 输出没有此问题)。

\n

请参阅Junio C Hamano ( )的提交 6a61661(2022 年 5 月 12 日)。\n (由Junio C Hamano 合并 -- --提交 6cd6906中,2022 年 5 月 23 日)gitster
gitster

\n
\n

archive:不要让磁盘模式泄漏到 zip 存档中

\n
\n
\n

当使用“ --add-file”选项将未跟踪文件中的内容添加到存档时,这些文件的权限模式位将按"write_entry()原样发送到存档后端特定的“方法。
\n我们将跟踪文件的模式位规范化在我们将它们传递给write_entry()方法之前;我们应该在这里做同样的事情。

\n

这对于“” archive-backend 来说并不是严格需要的tar,因为它有自己的代码来进一步清理它们,但“ zip” archive-backend 还没有准备好。

\n
\n