Thay đổi viết hoa tên tệp trong Git


473

Tôi đang cố gắng đổi tên một tệp để có cách viết hoa khác với những gì trước đây:

git mv src/collision/b2AABB.js src/collision/B2AABB.js
fatal: destination exists, source=src/collision/b2AABB.js, destination=src/collision/B2AABB.js

Như bạn có thể thấy, Git ném phù hợp với điều này. Tôi cũng đã thử đổi tên bằng cách sử dụng mvlệnh cũ đơn giản , nhưng Git không nhận đổi tên (dưới dạng đổi tên hoặc dưới dạng tệp mới không bị theo dõi).

Làm cách nào tôi có thể thay đổi một tệp để có cách viết hoa khác cùng tên? Tôi đang dùng Mac OS X v10.7.3 (Lion) với Git 1.7.9.1 bằng cách sử dụng Z shell (zsh) 4.3.15.


49
đó là bởi vì hệ thống tập tin osx được bảo quản theo trường hợp và mặc định không nhạy cảm. Bạn chỉ có thể tiến hành theo hai bước:git mv myfile foo; git mv foo MyFile
tonio

16
Làm cho nó hoạt động với "git mv --force myfile MyFile".
Marcello de Sales


7
Bắt đầu từ git 2.0.1 (tháng 6 năm 2014), git mv hello.txt Hello.txtsẽ hoạt động trên hệ điều hành không nhạy cảm. Xem câu trả lời của tôi dưới đây
VonC

Câu trả lời:


554

Bắt đầu từ Git 2.0.1 (ngày 25 tháng 6 năm 2014), git mvsẽ chỉ hoạt động trên một hệ điều hành không nhạy cảm .

Xem cam kết baa37bf của David Turner ( dturner-tw) .

mv: cho phép đổi tên để sửa trường hợp trong trường hợp hệ thống tập tin không nhạy cảm

" git mv hello.txt Hello.txt" trong trường hợp hệ thống tệp không nhạy cảm luôn gây ra destination already existslỗi "", vì hai tên này đề cập đến cùng một đường dẫn theo quan điểm của hệ thống tệp và yêu cầu người dùng đưa ra " --force" khi sửa trường hợp đường dẫn được ghi trong chỉ mục và trong cam kết tiếp theo.

Phát hiện trường hợp này và cho phép nó mà không yêu cầu " --force".

git mv hello.txt Hello.txtchỉ hoạt động (không --forceyêu cầu nữa).


Cách khác là:

git config --global core.ignorecase false

Và đổi tên tập tin trực tiếp; git thêm và cam kết.


2
FWIW này đã thoái lui hoặc không bao giờ làm việc trên Windows. Sáng ngày 2.15.1.windows.2 và vẫn cần sử dụng --force
TTimo

1
@Adowrath Tin tuyệt vời!
VonC

Điều này có hoạt động cho việc viết hoa phần mở rộng không, ví dụ: nếu có tên tệp image.TXT và tôi muốn đổi tên nó thành image.txt
siluveru kiran kumar

@siluverukirankumar Vâng. Bạn có bất kỳ vấn đề với usecase đó?
VonC

1
Làm cho nó hoạt động trên windows bằng cách chạy lệnh này vàgit config core.ignorecase false
John Targaryen

452

Xem xét câu trả lời của larsks , bạn có thể làm cho nó hoạt động với một lệnh duy nhất với "--force":

 git mv --force myfile MyFile

3
Nếu bạn đang sử dụng hệ thống tệp không nhạy cảm với trường hợp và bạn gặp phải lỗi nghiêm trọng "Đối số không hợp lệ", hãy thử các bước sau: stackoverflow.com/questions/3011625/
Levi

1
Mặc dù đây là câu trả lời chính xác cho bước đầu tiên, làm thế nào để bạn sau đó tiến hành chuyển sang một chi nhánh khác trong Mac OS X khi chi nhánh khác có viết hoa cũ. Tôi gặp lỗi ****: Các tệp cây làm việc không được theo dõi sau đây sẽ bị ghi đè khi thanh toán: ****
TJChambers

1
Điều này không thành công với cam kết đối với tôi trên Windows:Error: Will not add file alias 'MyFile' ('myfile' already exists in index)
OrangeDog

98

Đôi khi bạn muốn thay đổi cách viết hoa của rất nhiều tên tệp trên hệ thống tệp không nhạy cảm trường hợp (ví dụ: trên OS X hoặc Windows). Làm git mvlệnh sẽ mệt mỏi nhanh chóng. Để làm cho mọi thứ dễ dàng hơn một chút, đây là những gì tôi làm:

  1. Di chuyển tất cả các tệp bên ngoài thư mục sang, giả sử máy tính để bàn.
  2. Làm một git add . -Ađể loại bỏ tất cả các tập tin.
  3. Đổi tên tất cả các tệp trên máy tính để bàn thành viết hoa đúng.
  4. Di chuyển tất cả các tập tin trở lại thư mục gốc.
  5. Làm a git add .. Git sẽ thấy rằng các tập tin được đổi tên.

Bây giờ bạn có thể thực hiện một cam kết nói rằng bạn đã thay đổi viết hoa tên tệp.


3
Điều này đến với chi phí của tất cả lịch sử trong các tập tin bạn di chuyển vào và ra, phải không? Tôi đoán git mv - Force không có thiếu sót này.
LOAS

12
Không, điều này sẽ không loại bỏ tất cả lịch sử. Lưu ý rằng không có cam kết giữa hai bổ sung.
Michael L Perry

63

Tên tệp trong OS X không phân biệt chữ hoa chữ thường (theo mặc định). Đây là một vấn đề hệ điều hành nhiều hơn một vấn đề Git. Nếu bạn loại bỏ và tập hợp lại tập tin, bạn sẽ nhận được những gì bạn muốn hoặc đổi tên nó thành một cái gì đó và sau đó đổi tên nó trở lại.


2
Bạn cũng có thể git clonerepo trên hệ thống Linux, đổi tên các tệp và cam kết chúng chỉ trong tình huống này (nếu bạn có sẵn hệ thống Linux).
gitaarik

4
Trên thực tế, các hệ thống tập tin trên OS X có thể phân biệt chữ hoa chữ thường, bạn có thể cấu hình nó khi cài đặt. Cách kiểm tra xem phân vùng OS X có phân biệt chữ hoa chữ thường hay không
Flimm

2
... do đó "(theo mặc định)" trong câu trả lời.
larsks

4
Để xác nhận, bạn có thể sử dụng git rm --cached fileorfolderđể xóa tệp hoặc thư mục khỏi git mà không xóa tệp hoặc thư mục khỏi hệ thống tệp. Sau đó, bạn có thể chỉ cần thêm tập tin hoặc thư mục một lần nữa với git add fileorfolder.
kas

32

Đặt ignorecasethành falsetrong git config

Vì bài viết gốc là về "Thay đổi cách viết hoa tên tệp trong Git":

Nếu bạn đang cố gắng thay đổi viết hoa của một tên tập tin trong dự án của bạn, bạn không cần phải buộc đổi tên nó từ Git. IMO, tôi muốn thay đổi cách viết hoa từ IDE / trình soạn thảo của mình và đảm bảo rằng tôi định cấu hình Git đúng cách để chọn đổi tên.

Theo mặc định, mẫu Git được đặt thành trường hợp bỏ qua (trường hợp Git không nhạy cảm). Để xác minh bạn có mẫu mặc định, sử dụng --getđể truy xuất giá trị cho một khóa được chỉ định. Sử dụng --local--globalđể cho Git biết nên chọn một giá trị khóa cấu hình từ cấu hình kho lưu trữ Git cục bộ của bạn hoặc toàn cục. Ví dụ: nếu bạn muốn tra cứu khóa toàn cầu của mình core.ignorecase:

git config --global --get core.ignorecase

Nếu điều này trở lại true, hãy đảm bảo đặt nó là:

git config --global core.ignorecase false

(Hãy chắc chắn rằng bạn có quyền thích hợp để thay đổi toàn cầu.) Và ở đó bạn có nó; bây giờ cài đặt Git của bạn sẽ không bỏ qua các chữ viết hoa và coi chúng là những thay đổi.

Theo gợi ý, nếu bạn đang làm việc trên các dự án đa ngôn ngữ và bạn cảm thấy không phải tất cả các dự án nên được Git xử lý theo trường hợp nhạy cảm, chỉ cần cập nhật core.ignorecasetệp cục bộ .


6
Và nếu git config --global --get core.ignorecasekhông trả lại bất cứ điều gì. Có phải không true?? bởi vì sau khi tôi đặt nó, falsenó sẽ trả về false (Windows 10)
fralbo

Và dường như không hoạt động như mong đợi. Ý tôi là máy khách để bàn nhìn thấy sự thay đổi nhưng sau khi xác nhận / đồng bộ hóa, tên tệp vẫn không thay đổi trực tuyến!
fralbo

Làm việc cho tôi (và tốt hơn cho nhiều tệp hơn là sử dụng git mv). Tôi cũng cho rằng theo mặc định nó được coi là đúng (nghĩa là nó bỏ qua trường hợp). Hoặc, hoặc nó phù hợp với chính sách của HĐH với vỏ tên tệp.
Jerry

Đó là câu trả lời. Chỉ cần sử dụng nó.
Dave Everitt

1
Đây phải là câu trả lời được chọn
Dave Everitt

7

Bạn có thể mở thư mục ".git" và sau đó chỉnh sửa tệp "config". Trong phần "[core]", đặt "ignorecase = true" và bạn đã hoàn tất;)


Có vẻ như nó nên được thay đổi thành false sao cho git sẽ phân biệt chữ hoa chữ thường?
Jonathan

1

Để hàng loạt git mvtệp để chữ thường trên macOS:

for f in *; do git mv "$f" "`echo $f | tr "[:upper:]" "[:lower:]"`"; done

Nó sẽ viết thường tất cả các tập tin trong một thư mục.


1

Đoạn mã Python này sẽ git mv --forcetất cả các tệp trong một thư mục được viết thường. Ví dụ: foo / Bar.js sẽ trở thành foo / bar.js thông qua git mv foo/Bar.js foo/bar.js --force.

Sửa đổi nó theo ý thích của bạn. Tôi chỉ hình dung tôi muốn chia sẻ :)

import os
import re

searchDir = 'c:/someRepo'
exclude = ['.git', 'node_modules','bin']
os.chdir(searchDir)

for root, dirs, files in os.walk(searchDir):
    dirs[:] = [d for d in dirs if d not in exclude]
    for f in files:
        if re.match(r'[A-Z]', f):
            fullPath = os.path.join(root, f)
            fullPathLower = os.path.join(root, f[0].lower() + f[1:])
            command = 'git mv --force ' + fullPath + ' ' + fullPathLower
            print(command)
            os.system(command)

-1

Ví dụ làm việc:

git mv ./src/images/poster_video.PNG ./src/images/poster_video.png

2
Câu trả lời của bạn không giải quyết được câu hỏi ban đầu. Bạn đang hạ thấp phần mở rộng
Tavo

Tôi đang tìm kiếm chính xác điều này, nhưng cho 500 hình ảnh. tôi muốn đổi tên ./src/images/TESTIMAGE.png thành ./src/images/testimage.png trên git
Mohak Londhe
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.