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