2012-11-06 23 views
8

Tôi có một tập tin mà quản lý để có được bản thân tên là:Di chuyển một tập tin với một cái tên rất lạ từ git

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

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

Vì lý do gây phiền nhiễu, cây làm việc trên dự án đặc biệt này là đầy đủ các file khác vẫn cần tổ chức . Tôi muốn để có được những entry trên ra khỏi đó, nhưng khi tôi cố gắng git add "test/fixtures..." hoặc git rm "test/fixtures..." nó không thành công:
fatal: pathspec 'test/fixtures/companies.yml\342\200\250companies.yml' did not match any files

Làm thế nào tôi có thể đối phó với điều này?


tình trạng 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" 
+0

Tôi có thể tạo, 'git add' và' git rm' một tệp có tên đó với hầu như không gặp bất kỳ sự cố nào. nền tảng của bạn là gì? –

+0

kiểm tra git rm/đồ đạc/công ty.yml * (nếu bạn không có các tệp khác phù hợp với mẫu)? Sử dụng ký tự đại diện để làm việc xung quanh tên tập tin có vấn đề là một truyền thống cũ. –

+0

'git checkout - test/fixtures ...' làm gì? –

Trả lời

10

Git được in octet đen của bảng mã UTF-8 của tên tập tin, vì họ là các ký tự ASCII, và in chúng như thoát bát phân. Tuy nhiên, trình bao của bạn không hiểu chúng và đang gửi các dấu gạch chéo ngược và chữ số tới lệnh git khi bạn cắt và dán, vì vậy bạn đang thực sự nhập một tên tệp khác.

Hoặc sử dụng hoàn thành tab sau khi nhập test/fixtures/companies.yml (nếu vỏ của bạn hỗ trợ điều này) sẽ nhập các ký tự thực hoặc ký tự đại diện thay vì thoát, test/fixtures/companies.yml*companies.yml. Sau có thể, nhưng có thể không khớp với tên tệp khác.

Một khả năng khác là chỉ cần đổi tên tệp thành một cái gì đó lành mạnh hơn, tất nhiên rồi sử dụng git add -u/git add . để nhận được thông báo đổi tên.

+0

Tôi không có tab hoàn thành trong vỏ của tôi, vì vậy tôi đã sao chép tên từ Finder trực tiếp vào 'git rm 'text/fixtures/[paste]" '. Điều này đã làm việc! +1 – sscirrus

+0

@sscirrus giải thích khá đầy đủ về vấn đề và giải pháp làm việc. 1 từ tôi nữa. – VonC

+0

Tôi đã xóa một cài đặt wordpress từ repo địa phương của tôi (với các bản tải lên có các ký tự UTF8), và 'git rm blog/*' đã làm việc kỳ diệu. Cảm ơn! – h2ooooooo

11

Kể từ khi bạn đang ở trong bash, bạn có thể sử dụng printf command:

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

Octal thoát bắt đầu với \ 0 có thể chứa lên đến bốn chữ số.
(POSIX chỉ định tối đa ba)

Bạn có thể thấy giải pháp tương tự tại "Git: how to specify file names containing octal notation on the command line".

Điều đó sẽ xóa tệp khỏi chỉ mục trong khi vẫn giữ nó trên cây đang hoạt động.
Sau đó, bạn có thể đổi tên nó nếu muốn.

+0

Cảm ơn @VonC. Giải pháp tuyệt vời, +1. – sscirrus

+0

Tôi vừa nhận ra những giải pháp này chỉ là di chuyển tập tin thành 'thay đổi để được commit'. Nó không để lại cây làm việc của tôi một mình ... – sscirrus

+0

@sscirrus Tôi đã chỉnh sửa câu trả lời để đảm bảo cây làm việc không bị ảnh hưởng. – VonC

1

Tôi muốn xóa một thư mục trong kho lưu trữ git có tên có chứa chữ cái tiếng Nga: "Файлы Mail.Ru Агента". Trước tiên, tôi đã xóa thư mục theo cách thủ công và muốn xóa thư mục đó trong git bằng

git rm "..." 

lệnh trong bước tiếp theo. Nhưng git cho tôi thấy một tên rất bí mật của thư mục đã bị xóa: "\ 320 \ 244 \ 320 \ 260 \ 320 \ 271 \ 320 \ 273 \ 321 \ 213 Mail.Ru \ 320 \ 220 \ 320 \ 263 \ 320 \ 265 \ 320 \ 275 \ 321 \ 202 \ 320 \ 260 ". tôi khôi phục thư mục với

git checkout 

và không chỉ sao chép tên của thư mục và thực hiện lệnh

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

Nó làm việc!

Các vấn đề liên quan