我从另一个来源获取了一些更改的tarball,想知道哪些文件没有被更改。目标是Git克隆,所以很容易看到什么是新的,什么已经改变。有人知道如何获取未更改的列表(不包括未跟踪的文件)吗?
编辑:换句话说,我希望利用Git查找在新副本(tarball)中可能不存在的预先存在于Git中的文件。
我从另一个来源获取了一些更改的tarball,想知道哪些文件没有被更改。目标是Git克隆,所以很容易看到什么是新的,什么已经改变。有人知道如何获取未更改的列表(不包括未跟踪的文件)吗?
编辑:换句话说,我希望利用Git查找在新副本(tarball)中可能不存在的预先存在于Git中的文件。
我没有找到纯git的解决方案,但是这是对我有用的:
diff <(git diff --name-only) <(git ls-files -- sub/dir) | grep "^>" | cut -b3-
使用的命令解释:
git diff --name-only # list modified files
git ls-files -- sub/dir # list all git--tracked files in sub/dir
grep "^>" # match lines starting with '>', i.e. diff's marker for lines present in the second set but not in the first one (i.e. unmodified files)
cut -c3- # remove diff's marker (i.e. remove first two characters)
# <( command ) gives output of the command as a file (diff command needs two files to compare them)
可能:
$ git diff --name-only > tmpfile
$ git ls-files -X tmpfile
$ rm tmpfile
ls-files -X...
只会排除未追踪的文件。它不会排除与模式匹配的已追踪文件。 - Jez在得到一些帮助后:
comm -23 <(git ls-files | sort) <(git diff --name-only | sort)
man comm
。该命令会将所有被跟踪的文件与所有已修改的文件进行比较,排除只存在于后者或两者都存在的文件,最终只留下未被修改的文件。