2010-05-28 18 views
11

Tôi đã sử dụng git cùng với fugitive.vim để quản lý mã khi tôi đang ở trên các cửa sổ. Tuy nhiên, tôi đã gặp phải vấn đề. Theo documentation, lệnh: GDiff sẽ là cửa sổ khác và cho phép tôi chỉ hiển thị các phần của tệp. Tuy nhiên, khi tôi phát lệnh trong một tệp có thay đổi, tôi nhận được thông báo lỗi sau: alt textLỗi khi sử dụng: Lệnh GDiff của fugitive.vim bằng gvim cho windows và msys git 1.7.0.2

Đây có phải là vấn đề với cửa sổ không? vim? chạy trốn? msysgit? quyền truy cập tệp? Có ai biết không?

+3

Tôi đang gặp sự cố tương tự * _exact_ * - vui lòng cho chúng tôi biết nếu/cách bạn giải quyết vấn đề này! – Charles

Trả lời

1

Điều đó có thể liên quan đến issue 428 of msysgit mentioned in my SO answer.

Hãy thử vá cmd/git.cmd như tôi đã mô tả trong câu trả lời trước đây của mình và xem liệu trợ giúp này có phù hợp không.

Baring rằng, 2 lựa chọn vẫn là:

  • hoặc là một vấn đề khóa (các tập tin được khóa bởi một quá trình): một tiện ích như process monitor hoặc process explorer có thể giúp đỡ để xem nếu nó là trường hợp (và những gì xử lý chính xác có trên tệp hoán đổi đó)
  • hoặc sự cố Git. Một mẹo hay là cài đặt bộ cài đặt net của msysgit, nó sẽ xây dựng phiên bản Git mới nhất trên Windows của bạn. Sau đó, bạn có thể thử và xem sự cố vẫn tiếp diễn với phiên bản cập nhật đó hay không.
    Lưu ý: tùy chọn thứ ba, cố gắng hạ cấp Git, một lần nữa để loại trừ bất kỳ liên kết nào với công cụ đó.
+0

Tôi đã vá git.cmd, đã khắc phục vấn đề trước đó (cảm ơn vì điều đó, nhân tiện. –

+0

@Paul: Tôi không nhận ra rằng bạn là người hỏi câu hỏi trước đó! ;) – VonC

+0

@Paul: Tôi đã cập nhật câu trả lời của mình với một số bài kiểm tra khác cần thực hiện. – VonC

1

BTW lỗi tương tự Tôi nhận được, khi tôi cố gắng: gdiff tệp chưa lưu - khi tôi lưu nó (: w) nó hoạt động!

14

Tôi gặp sự cố tương tự - đây là cách tôi đã khắc phục sự cố.

Theo mặc định, Vim sẽ cố gắng lưu trữ các tệp hoán đổi bên cạnh tệp gốc. Fugitive tạo ra một bộ đệm mà không tương ứng với bất kỳ đường dẫn tập tin thực sự, do đó, Vim barfs khi nó cố gắng tạo ra các tập tin trao đổi. Giải pháp là đảm bảo rằng Vim có đường dẫn là có thể ghi vào.

Đây là cách tôi cố định này:

if has("win32") || has("win64") 
    set directory=$TMP 
else 
    set directory=~/tmp 
end 

Dưới đây là vấn đề ban đầu trên GitHub: https://github.com/tpope/vim-fugitive/issues/9

EDIT:

Như fow điểm trình bày dưới đây, nó có thể là tốt hơn để sử dụng một cái gì đó như sau:

set directory+=,~/tmp,$TMP 

Vim nên sử dụng đường dẫn đầu tiên có thể.

+1

Cần lưu ý rằng tùy chọn ''directory'' là danh sách các thư mục và Vim sẽ sử dụng thư mục đầu tiên có thể. Tốt nhất là chỉ cần thêm một giá trị vào danh sách chứ không phải xóa toàn bộ điều, như trong 'set directory + = $ TMP'. Thật an toàn khi thực hiện điều này mà không cần kiểm tra hệ điều hành vì '~/tmp' được thêm mặc định trong Unix và thậm chí nếu' $ TMP' trống trên Unix, việc thêm nó sẽ không làm gì cả – fow

+0

@fow: +1 - Tôi cần để bao gồm ',' khi tôi làm 'set directory + =', right (vì nó là một danh sách phân tách comment)? – Charles

+0

Ngoài ra, hãy thử 'set directory^= $ TMP' (xem [': help: set^= '] (http://vimhelp.appspot.com/options.txt.html#%3Aset%5E%3D)). –

2

Tôi không có máy Windows, nhưng tôi có thể tái tạo và tách biệt sự cố này trên hệ thống Mac OS X 10.6.

Hoặc tạo ra C:\TMP hoặc C:\TEMP (:help 'directory' nói cả hai đều ở giá trị mặc định của directory tùy chọn trên Windows xây dựng của Vim), hoặc thêm một thư mụchiện với giá trị của tùy chọn directory.

Tôi sử dụng thư mục tạm thời Vim cụ thể trong thư mục chính của tôi (một lần nữa, không có Windows ở đây) và thêm hai dấu gạch chéo (~/tmp/.vim-swaps//). Kiểu cài đặt này tập trung các tệp hoán đổi nhưng cung cấp cho chúng các tên duy nhất dựa trên các thư mục của các tệp đang được chỉnh sửa. Xem “Ưu điểm” và “Nhược điểm” trong :help :swapname cũng như “nếu thư mục kết thúc bằng hai đường phân tách” bit trong :help 'directory'.

Sử dụng ^= để thêm vào trước thư mục của bạn (để nó luôn được sử dụng, nếu nó tồn tại):

set directory^=C:\\some\\existing\\directory// 

Hoặc, sử dụng += để thêm thư mục của bạn (để nó chỉ được sử dụng nếu nó tồn tại và không áp dụng directory mục khác tồn tại):

set directory+=C:\\some\\existing\\directory// 

Charles’ answer gợi ý rằng $TMP (một tham chiếu đến một biến môi trường) có thể là một giá trị tốt cho Windows:

set directory+=$TMP// 

Nguyên nhân sâu xa có liên quan đến các giá trị mặc định của directory tùy chọn kết hợp với tên đường dẫn của tập tin index :Gdiff ‘s‘giả’.

Bộ đệm cho phía chỉ mục của chế độ xem :Gdiff sử dụng một tên đường dẫn đặc biệt trông giống như fugitive:///path/to/repository/.git//0/path/to/file/under/repository (fugitive capture đọc và ghi vào bộ đệm được đặt tên và chuyển hướng chúng đến chỉ mục bằng cách gọi lệnh Git "plumbing").

Mục nhập đầu tiên trong directory thường là .. Điều này có nghĩa là Vim sẽ cố gắng đặt swapfile trong cùng thư mục với tệp đã chỉnh sửa (tức là foo/bar.txt sẽ cố sử dụng foo/.bar.swp). Nếu không thể tạo swapfile ưu tiên này, thì các mục tiếp theo từ directory sẽ được thử.

Với .directory đầu tiên, hình thức hoán đổi ưa thích cho fugitive:///path/to/repository/.git//0/path/to/file/under/repository sẽ là fugitive:///path/to/repository/.git//0/path/to/file/under/.repository.swp. Các thành phần hàng đầu của tên đường dẫn này (fugitive:, path, to, v.v.) có thể không tồn tại, vì vậy Vim sẽ đi tới mục nhập tiếp theo từ directory. Nếu không có mục nhập nào khác trong số directory có thể sử dụng để tạo tệp hoán đổi (ví dụ: chúng không tồn tại), thì bạn sẽ gặp lỗi E302.

Tôi đã có thể tái tạo sự cố của bạn trên hệ thống UNIX-y bằng cách sử dụng set directory=.,~/no-such-dir,/var/no-such-dir,/no-such-dir (ví dụ: sử dụng giá trị mặc định của Unix và thay đổi các lần xuất hiện tmp thành no-such-dir). Không có thư mục “no-such-dir” nào tồn tại. Tôi gặp lỗi tương tự khi sử dụng :Gdiff.

:help :set^= chỉ nói “add”, nhưng mã cho thấy set listopt^=… prepends tương tự như cách set listopt+=… gắn thêm (như sau này được ghi chép lại để làm). Cả hai sẽ tự động chèn dấu phẩy khi cần thiết (mặc dù có thể có lỗi trong khu vực này).

+0

tôi tự hỏi tại sao fugitive cho phép cả đọc và ghi vào bộ đệm 'fugitive: /// path/to/repository/.git // 0/path/to/file/under/repository'? Tại sao họ không chỉ đọc? Trong trường hợp của tôi, tôi có thể sửa đổi các bộ đệm đó, và nếu tôi lưu chúng và sau đó thực thi 'git diff', đầu ra sẽ bị ảnh hưởng. –

+1

@ HảiPhong: Cũng thử 'git diff --cached'. Với những pseudo-pathnames (những cái như 'fugitive: //…/.git // 0 /…'), việc chỉnh sửa và lưu chúng tương đương với việc thay đổi trực tiếp nội dung được sắp xếp cho lần commit kế tiếp (tức là “index” của Git) : giai đoạn 0). Nếu bạn tin tưởng vào việc sử dụng chỉ mục để tạo cam kết tiếp theo, nó có thể là một công cụ mạnh (như 'git add' hoặc' git reset' bằng '--patch', nhưng trực tiếp hơn nhiều). Nếu bạn không thích sử dụng chỉ mục, bạn có thể "xóa" nội dung của nó (làm cho nó khớp với HEAD) với 'git reset ' (hoặc ': Gread -' trong bộ đệm được đề cập). –

+0

Wow, điều đó giải thích nó. Cảm ơn bạn –

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