4

libgit2 (C++) を使用して、git リポジトリとコミットを作成しています。正常に動作しますが、チェックアウトによってすべてのローカル ファイルが破棄されます。

ただし、それらはまだ repo に存在しているようです。リポジトリを調べようとすると、それが得られます。

Welcome to Git (version 1.8.3-preview20130601)


Run 'git help git' to display the help index.
Run 'git help <command>' to display help for specific commands.

x@x-PC /C/Users/x/Desktop/poiu (master)
$ git log
commit a63cd37ef7d7228053b875e396531d367e2ea745
Author: Unregistered User <unregistered@x.com>
Date:   Fri Oct 25 13:27:21 2013 +0200

    Project Save

x@x-PC /C/Users/x/Desktop/poiu (master)
$ git checkout a63cd37ef7d7228053b875e396531d367e2ea745
D       "db\\32\\879a83081b8d0b4ef41a37b9e28138"
D       "db\\41\\930644af1f4ab6d288bf3d50829558"
D       "db\\48\\3172d42be6ccb80e57071d5aabb584"
D       "db\\80\\0b152a41ba2ef0bc1c55c96add4d33"
D       "db\\c1\\3b1ce3276ed14d7ff7c6ace9b63cf3"
D       "db\\fa\\50e29fe380a8117140463106ae67b1"
Note: checking out 'a63cd37ef7d7228053b875e396531d367e2ea745'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b new_branch_name

HEAD is now at a63cd37... Project Save

x@x-PC /C/Users/x/Desktop/poiu ((a63cd37...))
$ git checkout -f a63cd37ef7d7228053b875e396531d367e2ea745
error: unable to create file db\32\879a83081b8d0b4ef41a37b9e28138 (No such file or directory)
error: unable to create file db\41\930644af1f4ab6d288bf3d50829558 (No such file or directory)
error: unable to create file db\48\3172d42be6ccb80e57071d5aabb584 (No such file or directory)
error: unable to create file db\80\0b152a41ba2ef0bc1c55c96add4d33 (No such file or directory)
error: unable to create file db\c1\3b1ce3276ed14d7ff7c6ace9b63cf3 (No such file or directory)
error: unable to create file db\fa\50e29fe380a8117140463106ae67b1 (No such file or directory)
HEAD is now at a63cd37... Project Save

x@x-PC /C/Users/x/Desktop/poiu ((a63cd37...))
$

さて、「奇妙な」のは、事前に手動で db\xx ディレクトリを作成すると、チェックアウト -f が機能することです。

さらに奇妙なことに、MacOSx ではすべてがそのまま動作しますが、Windows では動作しません ...

ここで何が起こっているのか分かりますか?

4

2 に答える 2

3
$ git checkout a63cd37ef7d7228053b875e396531d367e2ea745
D       "db\\32\\879a83081b8d0b4ef41a37b9e28138"

引用符を参照してください。git は、C 文字列リテラル規則を使用して、ファイル名に通常とは異なる文字が含まれていることを表示します。あなたのレポは、そのC文字列を名前として含むファイルを記録します-バックスラッシュが含まれています。

:\、および/どこでも無効ではありません。

$ touch "db\\32\\879a83081b8d0b4ef41a37b9e28138"
$ ls
db\32\879a83081b8d0b4ef41a37b9e28138
$ git add .
$ git ls-files
"db\\32\\879a83081b8d0b4ef41a37b9e28138"
$ 

しかし、それらは移植可能ではありません。

大まかに言えば、Windows ファイルシステムは\:、Mac、:、Unix を予約して/います。まだ予約制のシステムがあるかもしれません;

于 2013-11-05T10:19:26.827 に答える
1

MacOSx と Windows でヘッドが切り離された状態になっているかどうかを確認できますか?

別のアイデアは、ファイルシステムの違いです。これに関連する何かを見つけることができますか?

于 2013-11-01T12:14:48.773 に答える