我正在尝试在git的最后一次提交中更改文件,并将它们放入单独的文件夹中。有蚂蚁脚本或shell脚本可以完成这项工作吗?
为了给您一个背景,我正在尝试实现一个持续的集成和交付管道,以仅将git分支中已更改的文件发布到salesforce环境。我正在使用ant build.xml和force.com迁移工具来实现此目的。 git分支当前包含sandbox的完整元数据。我不想在发布时部署整个元数据,因此只需要获取已更改的文件并将这些文件仅部署到目标Salesforce环境即可。
任何帮助将不胜感激。在这个阶段,我有点受阻,不知道如何进行。
答案 0 :(得分:1)
让我们从以人为本的答案开始,但是请注意,您正在尝试构建机器会做的事情,并且机器通常是非常快速的白痴,即使您有这种情况,它们也会遵循您的指示遇到奇怪的情况,他们应该做些更聪明的事情。
假设您拥有完整的存储库(或至少具有足够提交的浅存储库),请使用git diff --name-only
或git 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.renames
和diff.renameLimit
设置控制。如果用户尚未配置设置,则基础默认值也取决于Git版本。因此,您应该使用git diff
而不是git diff-tree
,这是一个管道命令。
使用起来比较麻烦,因为您必须指定所有内容,尤其是-r
(递归)标志,以找出不同子树中的不同之处。您可能还应该使用-z
标志来使它以零结尾的文件名,以便在所有情况下都可以可靠地处理它们。
如果使用子模块,请考虑如何处理这些子模块。
在所有情况下,请仔细阅读the git diff-tree
documentation。