【问题标题】:Create git archive from repo without a commit无需提交即可从 repo 创建 git 存档
【发布时间】:2019-09-22 11:16:29
【问题描述】:

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

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

【问题讨论】:

标签: git zip tar git-archive


【解决方案1】:

除了提交之外,请考虑git bundle:它类似于git archive...,但有历史记录。

您会得到一个文件(捆绑文件),您可以复制该文件,然后从中克隆
更多信息请参见“Fully backup a git repo?”。

【讨论】:

    【解决方案2】:

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

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

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

    这里的问题是git write-tree 将立即写入 index 中的任何内容。这意味着您需要将所有更新的文件添加到索引中,即使您不打算提交。如果您想获得更多花哨,可以使用临时索引来做到这一点,但首先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 是否做了任何事情很烦人。你可以添加更多的脚本层来处理这个问题,但实际上,现在提交有什么问题?

    【讨论】:

    • 我只会使用一个临时分支,但是当我这样做时,我最终会意外地关闭该分支,因为我返回前一个分支的脚本失败或其他原因。我正在考虑做某种“虚拟分支”,它不会以某种方式影响原始回购的状态。要执行此虚拟分支,我可以将存储库的浅表克隆到磁盘上的某个临时位置?
    • 另外,tar 使用T 命令,您可以使用git ls-files | tar Tcf - my.tar 从当前工作树内容制作存档,而无需写入树,并使用git ls-files --exclude-standard -oc | tar Tcf - my.tar 压缩每个文件git add . 会看到。
    • @jthill:取决于您的 tar 版本,尽管它似乎至少在今天的 FreeBSD 和 Linux 中存在。我不记得它在 Solaris 或 4.4BSD tar ... 1997 POSIX 标准没有它:pubs.opengroup.org/onlinepubs/007908799/xcu/tar.html - 但 pax 从标准输入读取文件,并且可以写入 tar 格式:pubs.opengroup.org/onlinepubs/007908799/xcu/pax.html
    • 不知道mingw环境是否包含pax; POSIX 对 pax/cpio/tar 非常奇怪……它根本不包括 tarcpio。但是,是的,如果命令在那里,我认为git ls-files | pax -w my.tar 也会这样做。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-22
      • 2014-01-26
      • 2014-08-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-30
      相关资源
      最近更新 更多