我如何才能将最近一次提交的文件仅从git下载到文件夹中?

时间:2018-08-18 12:16:25

标签: git ant salesforce azure-devops continuous-deployment

我正在尝试在git的最后一次提交中更改文件,并将它们放入单独的文件夹中。有蚂蚁脚本或shell脚本可以完成这项工作吗?

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

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

1 个答案:

答案 0 :(得分:1)

让我们从以人为本的答案开始,但是请注意,您正在尝试构建机器会做的事情,并且机器通常是非常快速的白痴,即使您有这种情况,它们也会遵循您的指示遇到奇怪的情况,他们应该做些更聪明的事情。


假设您拥有完整的存储库(或至少具有足够提交的浅存储库),请使用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

,并且在将来的某个时候,您的 next 部署是您获取其哈希ID的其他提交(也许是通过git rev-parse进行的,就像有人这样做一样)名称master令人恐惧,例如重写提交历史记录,您仍然可以比较正确的两个提交。

现在让我们来探讨一些复杂性。

状态可能为“已删除”,“已添加”或更复杂的状态

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

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

这里的三个文件照常进行了修改,但是其中一个.travis.yml new 。它是在此提交对中创建的,未更改。

(我在这里偷了很多东西。)

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将这些面向用户的命令称为 porcelain ,将面向机器的命令称为 plumbing

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

尤其是,当且仅当启用重命名检测时,状态R(用于重命名)才会出现。默认情况下,重命名检测由用户的diff.renamesdiff.renameLimit设置控制。如果用户尚未配置设置,则基础默认值也取决于Git版本。因此,您应该使用git diff而不是git diff-tree,这是一个管道命令。

使用起来比较麻烦,因为您必须指定所有内容,尤其是-r(递归)标志,以找出不同子树中的不同之处。您可能还应该使用-z标志来使它以零结尾的文件名,以便在所有情况下都可以可靠地处理它们。

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

在所有情况下,请仔细阅读the git diff-tree documentation