如何仅将上次提交的文件从 git 下载到文件夹?



我正在尝试在 git 中的最后一次提交中更改文件并将它们放入单独的文件夹中。是否有执行此工作的 ant 脚本或 shell 脚本?

为了给您一个上下文,我正在尝试实现一个连续的集成和交付管道,以仅将 git 分支中更改的文件发布到 salesforce 环境。我正在使用 ant 构建.xml 和 force.com 迁移工具来实现这一目标。git 分支当前包含沙盒的完整元数据。我不想在发布时部署整个元数据 - 因此需要仅获取更改的文件并仅将这些文件部署到目标 salesforce 环境。

任何帮助将不胜感激。我在这个阶段有点被阻止,不知道如何进行。

让我们从一个面向人类的答案开始,但请注意,你正在尝试构建机器会做的事情,而机器通常是非常快的白痴,即使你遇到了一个奇怪的情况,它们应该做一些更聪明的事情,它们也会遵循你的指示。


假设您拥有完整的存储库(或至少是一个具有足够提交的浅层存储库(,请使用git diff --name-onlygit diff --name-status提取相关文件的名称:

$ git diff --name-status master~1 master
M       Documentation/RelNotes/2.19.0.txt

例如,告诉我在当前master之前在第一个父方向上提交一个图形步骤和master本身之间,恰好通过修改更改了一个文件。

这里比较的两个提交是对这两个参数中的每一个进行git rev-parse的结果,因此如果您有哈希 ID,则比仅使用分支名称的状态更好。 分支名称以可能无法预测的方式移动,即,无法明显保证您以前的部署是master~1的。 提交哈希 ID 不会:如果您知道以前的部署是:

$ git rev-parse master
b7bd9486b055c3f967a870311e704e3bb0654e4f

并且在将来的某个时候,您的下一个部署是其他一些您获得其哈希 ID 的提交(也许通过git rev-parse就像这样(,如果有人用名称master做了一些可怕的事情并不重要,例如重写提交历史记录,您仍然可以比较正确的两个提交。

现在让我们进入一些复杂情况。

状态

可能是"已删除"或"已添加",或者更复杂的状态

让我们选择两个不同的提交进行比较:

$ git diff --name-status 3c6151dad310db71f599dbfbac329fa961f29794 979f030359f6830fbaebd0c76e9aad5f86993fef
M       .gitignore
M       .mailmap
A       .travis.yml
M       Documentation/CodingGuidelines

这里的三个文件像往常一样被修改,但.travis.yml一个文件是新的。 它是在这个提交对中创建的,而不是更改的。

(我在这里剪了很多。

R100    t/t5701-clone-local.sh  t/t5605-clone-local.sh
R100    t/t5702-clone-options.sh        t/t5606-clone-options.sh
R100    t/t5704-bundle.sh       t/t5607-clone-bundle.sh
R100    t/t5705-clone-2gb.sh    t/t5608-clone-2gb.sh
R100    t/t5706-clone-branch.sh t/t5609-clone-branch.sh
R100    t/t5707-clone-detached.sh       t/t5610-clone-detached.sh
R063    t/t5708-clone-config.sh t/t5611-clone-config.sh
R100    t/t5709-clone-refspec.sh        t/t5612-clone-refspec.sh
R099    t/t5710-info-alternate.sh       t/t5613-info-alternate.sh

这些文件已重命名

D       t/t5700-clone-reference.sh

此文件已删除

您还可以遇到其他状态,您应该决定如何处理它们。

git diff器命令;您需要管道命令

您需要对git diff的输出进行机器读取,但git diff- 尽管从这些示例中看起来不太可能 - 实际上旨在产生人类可读的输出,而不是机器可读的输出。 Git 将这些面向用户的命令称为瓷器,面向机器的命令称为管道

这有几个副作用。 最重要的是:用户配置更改git diff输出的显示方式。

特别是,当且仅当启用重命名检测时,才会显示R状态(对于重命名(。 默认情况下,重命名检测由用户的diff.renamesdiff.renameLimit设置控制。 如果用户未配置设置,则基础默认值也取决于 Git 版本。 所以与其使用git diff,不如使用git diff-tree,这是一个管道命令。

使用起来更令人讨厌,因为您必须指定所有内容,尤其是-r(递归(标志以找出不同子树中的不同之处。 您可能还应该使用-z标志使其零终止文件名,以便您可以在所有情况下可靠地处理这些文件名。

如果您使用子模块,请考虑如何处理这些子模块。

在所有情况下,请仔细阅读git diff-tree文档。

最新更新