我有一个脚本,对于
中的每个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
有谁知道发生了什么,以及如何解决这个问题? (获取并应用新远程文件的差异)
答案 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
就是你所需要的一切。