3

まったく奇妙な理由で、git リポジトリに行末が混在するファイルがあります。(オプションを に設定しgit diffてすべてのコミットが行われたとしても、少なくともそれが主張するものです。) コミットをチェリーピックしようとすると、それらの行末のために失敗します:core.autocrlftrue

$ git status
# On branch master
nothing to commit, working directory clean
$ git cherry-pick 77fe281
error: could not apply 77fe281... TFS changeset 9148
hint: after resolving the conflicts, mark the corrected paths
hint: with 'git add <paths>' or 'git rm <paths>'
hint: and commit the result with 'git commit'
$ git status
# On branch master
# You are currently cherry-picking.
#   (fix conflicts and run "git commit")
#
# Changes to be committed:
#
#       modified:   some/other/file.txt
#
# Unmerged paths:
#   (use "git add <file>..." to mark resolution)
#
#       both modified:      Builds/rakefile.rb
#
$ cat Builds/rakefile.rb |grep "<<<"
<<<<<<< HEAD
$ git cherry-pick --abort

ここでわかるように、Builds/rakefile.rb ファイルに競合があります。ところで、git は、これら 2 つのファイルのすべての行が異なると主張しています。これは、おそらく行末が異なるためです。しかし、少なくとも git はここで一貫しています。

ただし、ignore-all-space オプションを使用して同じことを試してみましょう。

$ git status
# On branch master
nothing to commit, working directory clean
$ git cherry-pick 77fe281 --strategy recursive -Xignore-all-space
error: addinfo_cache failed for path 'Builds/rakefile.rb'
U       Builds/rakefile.rb
error: 'commit' is not possible because you have unmerged files.
hint: Fix them up in the work tree,
hint: and then use 'git add/rm <file>' as
hint: appropriate to mark resolution and make a commit,
hint: or use 'git commit -a'.
fatal: Exiting because of an unresolved conflict.
$ git status
# On branch master
# You are currently cherry-picking.
#   (fix conflicts and run "git commit")
#
# Changes to be committed:
#
#       modified:   some/other/file.txt
#
# Unmerged paths:
#   (use "git add <file>..." to mark resolution)
#
#       both modified:      Builds/rakefile.rb
#
$ cat Builds/rakefile.rb |grep "<<<"
$

ここで git はファイルをマージできなかったと主張していますが、ファイルは実際にはマージされています (そして正しく!)。私は何を間違っていますか?

(暴言: git は、実際には、1960 年代にいるかのように eol の処理を​​強制する最初の VCS です)

4

1 に答える 1

3

これは、競合があったと考えた理由には答えませんが、チェリーピックで行末を無視する方法を知りたいと思っている他の人のために、あなたが提案したこと:

git cherry-pick a1b2c3d --strategy recursive -Xignore-all-space

まさに私が探していたことをしました。

于 2014-11-05T11:16:26.980 に答える