Git:检索两个修订版之间的所有新文件和修改过的文件

时间:2015-02-08 02:09:55

标签: git

我正在尝试使用diff命令获取所有已修改的文件和新文件,使用SHA在git上进行2次修订。

现在我可以使用以下示例命令生成补丁。

git diff SHA1 SHA2> patch.txt

但是,我需要在zip文件或文件夹中使用整个版本的新/修改过的文件。

[编辑,更多信息] 我真的需要一个输出,改变整个文件,而不是补丁格式。

提前致谢。

2 个答案:

答案 0 :(得分:1)

首先,免责声明;我对Perforce一无所知。也就是说,为什么不能从git获取补丁并将其应用到您的perforce环境中?类似的东西:

git diff sha1 sha2 | (cd /my/perforce/repo; patch -p1)

这应该注意将所有修改转换为新环境。

如果出于某种原因无效,您可以在修订版之间获取新的/修改/删除的文件列表,如下所示:

$ git log --name-status --pretty=format:'%H'  sha1..sha2 

这将为您提供如下输出:

0bf1587d08e303bc167b713eb5a9c05d55b34fde
M       fragments/kube-examples.yaml

36ba26ec88ac478eb4dc29b997c9e37fa51e37cf
M       fragments/configure-kubernetes-master.sh

6595da2f666dbe5c473457cd023c2a81555cb3b9
M       fragments/docker.service.yaml
D       fragments/wait-for-flanneld.yaml
M       kubenode.yaml

cb51ae97b769354656e103655c2532562b15c079
M       fragments/configure-flannel.sh

即,对于每个提交ID,提供添加,删除或的列表 修改过的文件你可以通过shell脚本来运行它来压缩 命名文件。这不会让你得到你想要的,但也许 它会激发一个合适的解决方案吗?

答案 1 :(得分:1)

执行git diff和pipe to patch file(如您所描述,然后将其压缩为zip)

正如您在Q中提到的那样:git diff sha1..sha1 >> patches a.txt

然后你可以将它压缩成zip :(取决于你的操作系统或使用跨平台的7-zip)

如果您需要文件执行此操作:

cp -pv --parents git diff --name-only DESTINATION-DIRECTORY

或这个完整的bash脚本:

#!/bin/bash
# Target directory
TARGET=/target/directory/here

for i in $(git diff --name-only)
    do
        # First create the target directory, if it doesn't exist.
        mkdir -p "$TARGET/$(dirname $i)"
        # Then copy over the file.
        cp "$i" "$TARGET/$i"
    done

另一种方法是使用 Patches by Email