11

私はそれ自体に名前を付けることができたファイルを持っています:

# file's name (both lines)
companies.yml
companies.yml

# entry in my git working tree
"test/fixtures/companies.yml\342\200\250companies.yml"

厄介な理由で、この特定のプロジェクトの作業ツリーには、まだ整理が必要な他のファイルがたくさんあります。上記のエントリを取得したいのですが、試してみるgit add "test/fixtures..."git rm "test/fixtures..."失敗します。
fatal: pathspec 'test/fixtures/companies.yml\342\200\250companies.yml' did not match any files

どうすればこれに対処できますか?


Gitステータス

On branch master
# Your branch is ahead of 'production/master' by 4 commits.
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)

modified:   [other files]
modified:   "test/fixtures/companies.yml\342\200\250companies.yml"
4

3 に答える 3

14

Git は、ファイル名の UTF-8 エンコーディングのリテラル オクテットを出力しています。それらは非 ASCII 文字であるためです。それらは 8 進エスケープとして出力されます。ただし、シェルはそれらを理解せず、切り取りと貼り付けを行うときにリテラルのバックスラッシュと数字を git コマンドに送信しているため、実際には別のファイル名を入力しています。

入力後にタブ補完を使用しtest/fixtures/companies.ymlて (シェルがこれをサポートしている場合)、実際の文字を入力するか、エスケープの代わりにワイルドカードを入力しますtest/fixtures/companies.yml*companies.yml。後者は他のファイル名と一致する可能性がありますが、おそらく一致しません。

別の可能性は、もちろん、ファイルの名前をより適切なものに変更し、git add -u/を使用git add .して git に名前の変更を通知させることです。

于 2012-11-06T12:21:04.237 に答える
12

あなたはbashにいるので、printfコマンドを使用できます:

git rm --cached `printf "test/fixtures/companies.yml\342\200\250companies.yml"`

\0 で始まる 8 進エスケープには、4 桁まで含めることができます。
(POSIX は 3 つまで指定)

「 Git: コマンド ラインで 8 進数表記を含むファイル名を指定する方法」で、同様の解決策を確認できます。

これにより、ファイルが作業ツリーに保持されたまま、インデックスからファイルが削除されます。
その後、必要に応じて名前を変更できます。


Git 2.18 (2018 年第 2 四半期、6 年後) で更新すると、単純な補完を使用して機能するはずです。

SZEDER Gábor ( )によるcommit 3dfe23b (2018 年 4 月 16 日)を参照してください。 szeder

補完: 非 ASCII パス名の補完をサポート

core.quotePath=falseユーザーが設定のどこかに' ' を持っていない限り、 ' git ls-files' と ' git diff-index' の両方がデフォルトで、 より大きい値のバイトを含むパス名を引用し、 それらのバイトを ' ' 8 進値0x80としてエスケープします。 これにより、補完される現在のパス コンポーネントに非 ASCII 文字 (特に UTF-8) が含まれている場合にパスが補完されなくなります。これは、リストされている引用符で囲まれたパスがコマンド ラインの現在の単語と一致しないためです。\nnn

core.quotePath=falseこれらの ' git ls-files' および ' ' の呼び出しに ' ' を設定すると、「異常」git diff-indexよりも大きいバイト数を考慮せず、その0x80ような文字を含むパス名を引用しません。

バックスラッシュ、二重引用符、または制御文字を含むパス名は引き続き引用されることに注意してください。このシリーズの後のパッチでそれらに対処します。

于 2012-11-06T12:40:22.707 に答える
1

ロシア語の文字「Файлы Mail.Ru Агента」を含む名前の git リポジトリ内のフォルダーを削除したかったのです。最初にフォルダーを手動で削除し、gitで削除したかった

git rm "..."

次のステップでコマンドを実行します。しかし、git は、削除されたフォルダーの非常に暗号化された名前を表示してくれました。 320\275\321\202\320\260". でフォルダーを復元しました

git checkout

フォルダの名前をコピーしてコマンドを実行しただけではありません

git rm "Файлы Mail.Ru Агента/*"

出来た!

于 2017-01-29T15:14:12.720 に答える