【问题标题】:Using Git to create an archive of changed files使用 Git 创建更改文件的存档
【发布时间】:2012-04-05 04:26:12
【问题描述】:

我正在寻找一种简单的解决方案来制作最近更改文件的存档。

我从google得到这个简单的命令

git archive -o update.zip HEAD $(git diff --name-only HEAD^)

当我在 GIT BUSH 中运行它时,它一直在说 致命:不是有效的对象名称

【问题讨论】:

  • 这来自哪个命令? (git diff --name-only HEAD^ 的输出是什么?你在一个有效的存储库中,对吧?)
  • git diff --name-only HEAD^ 将输出我要存档的已更改文件的列表。我已经用测试存储库测试了这个命令,它可以正常工作。它在我真正的 asp.net 项目存储库中不起作用
  • 我怀疑,有些不能存档?二进制?
  • git-archive 将归档任何文件 - 它们只是数据块。这里仅有的两个对象名称是HEADHEAD^。我试图让您检查以确保这两个都是您运行命令的存储库中的有效对象名称。例如,它可能只有一个提交,所以HEAD^ 没有任何意义.
  • HEAD 是“你现在在哪里”(无论你在做什么提交,通常是当前分支的尖端,但如果你处于“分离的 HEAD”状态,它只是“你的提交'在')。 HEAD^ 是“从你正在进行的提交开始,返回一个提交,即,到任何提交 git log 显示为它的父级。” (在合并提交的情况下,可以有多个父级;HEAD^ 选择“第一个”,并且有更多用于命名其他父级的语法。)

标签: git


【解决方案1】:

在这种情况下,我使用this answer 告诉我

tar czf changed-files.tar.gz `git diff --name-only [diff options]`

例如,要创建一个包含最近四次修订中更改的文件的存档,我会这样做

tar czf changed-files.tar.gz `git diff --name-only HEAD~4..`

这是假设 - 当然 - HEAD~4 确实存在。

【讨论】:

  • eckes,谢谢指出HEAD可以这样使用。
  • -1:此解决方案仅在 diff 中的文件存在于 HEAD 时才有效,无论您选择什么提交。
  • 警告:此解决方案仅显示 CHANGED 文件。如果您有新文件,此解决方案将跳过它们。使用 'git status -s' 或类似的东西也会获取添加的文件。
【解决方案2】:

我使用这个别名来包含不在 HEAD 中的新文件:

alias gittar='tar -czvf working-files.tgz \
              $(git status -s | sed -r "s/..(.*)/\1 /")'

【讨论】:

    【解决方案3】:

    您只需要过滤掉该差异时删除的文件即可修复该错误:

    git archive -o update.zip HEAD $(git diff --name-only --diff-filter=d HEAD^..HEAD)
    

    可能git archive 是该任务的开销,您应该使用@eckes's answer
    但是,您仍然应该添加 --diff-filter=d 以从存档中排除已删除的文件。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-13
      • 2012-10-02
      • 2018-10-29
      • 1970-01-01
      • 1970-01-01
      • 2011-02-24
      • 1970-01-01
      相关资源
      最近更新 更多