Git:应用新文件的差异

时间:2018-05-08 23:51:32

标签: bash git shell github diff

我有一个脚本,对于

中的每个changed_file
$ uname -a
CYGWIN_NT-6.1 CAP-D-ENG-INT3 2.10.0(0.325/5/3) 2018-02-02 15:16 x86_64 Cygwin
$ bash --version
GNU bash, version 4.4.12(3)-release (x86_64-unknown-cygwin) ...
$ gcc --version
gcc (GCC) 6.4.0 ...
$ g++ --version
g++ (GCC) 6.4.0 ...
$ make --version
GNU Make 4.2.1
Built for x86_64-unknown-cygwin ...
$ systeminfo | sed -n 's/^OS\ *//p'
Name:                   Microsoft Windows 7 Enterprise
Version:                6.1.7601 Service Pack 1 Build 7601
Manufacturer:           Microsoft Corporation
Configuration:          Member Workstation
Build Type:             Multiprocessor Free

该文件的差异应用如下:

"git diff --name-only master..origin/master"

对于任何新创建的文件(源master中的文件但最初不在master中的文件),我收到以下错误:

git diff master..origin/master file_name | git apply.

在SO上搜索时,我发现了关于git add的意图添加标志的以下信息:What does git add --intent-to-add or -N do and when should it be used?

所以我尝试了以下内容:对于每个文件,我要在origin / master和master之间获得差异,如果该文件当前不存在于master(本地)中,那么我调用git在使用该文件名调用git diff之前添加--intent-to-add标志并应用diff。

fatal: ambiguous argument 'my_file_name': unknown revision or path not in the working tree.

error: unrecognized input

有了这个,我在尝试执行git apply(最后一行)时遇到以下错误,说该文件已存在于工作目录中:

if ! ls "$changed_file" 1> /dev/null 2>&1; then
        echo adding new file "$changed_file"
        echo foo > "$changed_file"
        git add --intent-to-add "$changed_file"
fi
git diff master..origin/master "$changed_file" | git apply

当我尝试删除虚拟文件创建部分时,如下所示,它也没有用。

error: tests/new_file: already exists in working directory

错误消息与之前相同:

if ! ls "$changed_file" 1> /dev/null 2>&1; then
        echo adding new file "$changed_file"
        git add --intent-to-add "$changed_file"
fi

有谁知道发生了什么,以及如何解决这个问题? (获取并应用新远程文件的差异)

2 个答案:

答案 0 :(得分:1)

问题在于,一般来说,Git不知道file_name文件名称,还是分支名称,或者是什么。解决方案是告诉它:在双击--之后,没有可以是选项或分支名称:

git diff --name-only master origin/master -- file_name

同样的规则适用于git checkout等命令。如果您有一个名为master的文件并且想要查看它,该怎么办?命令:

git checkout master

没有工作,但命令:

git checkout -- master

,因为两个短划线告诉git checkout这是选项和分支名称的结尾等等:其他所有必须是文件名。

答案 1 :(得分:1)

git reset --hard origin/master      # reset index, worktree and ref
git reset --soft @{1}               # put the ref back

就是你所需要的一切。