Làm cách nào để tôi cam kết thay đổi tên tệp chỉ phân biệt chữ hoa chữ thường trong Git?


1302

Tôi đã thay đổi một tên vài tác phẩm của de-hoa chữ cái đầu tiên, như trong Name.jpgđể name.jpg. Git không nhận ra thay đổi này và tôi đã phải xóa các tệp và tải lại chúng. Có cách nào mà Git có thể phân biệt chữ hoa chữ thường khi kiểm tra các thay đổi trong tên tệp không? Tôi đã không thực hiện bất kỳ thay đổi cho các tập tin chính nó.


4
@nif điều này không hoàn toàn chính xác, Git thực sự có một cài đặt cấu hình kiểm soát xem nó có bỏ qua độ nhạy trường hợp hay không.


6
Xem stackoverflow.com/a/24979063/6309 : kể từ git 2.0.1, một git mvcông việc đơn giản .
VonC


Tham khảo bài này. Tôi đã có thể cam kết nhưng chỉ cần sử dụng git commit -m "tin nhắn" mà không có bất kỳ đường dẫn tệp nào làm tham số. Nó cập nhật chỉ mục và kiểm tra trong tập tin. [Liên kết] stackoverflow.com/questions/35790113/ Cách
ARKS

Câu trả lời:


1517

Bạn có thể sử dụng git mv :

git mv -f OldFileNameCase newfilenamecase

12
điều này mang lại cho tôi 'thư mục nguồn trống' trong khi nó không
WiseStrawberry

6
Sử dụng MacOS tại đây (FS không phân biệt chữ hoa chữ thường) và -f đã hoạt động! Cảm ơn vì tiền boa
caesarsol

49
Trong các phiên bản gần đây, bạn không còn cần -fcờ.
Joshua Pinter

8
Đừng quên cung cấp đường dẫn tập tin đầy đủ. Rõ ràng, tôi biết, nhưng đã cho tôi một thời gian
rickrizzo

7
Để đầu bình chọn bình luận: Bạn làm cần -fchuyển đổi với git mới nhất (2.18) nếu không bạn có thể nhận được các fatal: destination existslỗi.
DeepSpace101

1038

Git có một cài đặt cấu hình cho biết nó có phân biệt chữ hoa chữ thường hay không nhạy cảm : core.ignorecase. Để nói với Git là case-senstive, chỉ cần đặt cài đặt này thành false:

git config core.ignorecase false

Tài liệu

Từ git configtài liệu :

core.ignorecase

Nếu đúng, tùy chọn này cho phép các cách giải quyết khác nhau để cho phép git hoạt động tốt hơn trên các hệ thống tệp không phân biệt chữ hoa chữ thường, như FAT. Ví dụ: nếu danh sách thư mục tìm thấy makefilekhi git mong đợi Makefile, git sẽ cho rằng đó thực sự là cùng một tệp và tiếp tục ghi nhớ nó như Makefile.

Mặc định là sai, ngoại trừ git-clone (1) hoặc git-init (1) sẽ thăm dò và đặt core.ignorecasetrue nếu phù hợp khi kho lưu trữ được tạo.

Hệ thống tập tin không phân biệt chữ hoa chữ thường

Hai hệ điều hành phổ biến nhất có hệ thống tệp không phân biệt chữ hoa chữ thường mà tôi biết là

  • các cửa sổ
  • Hệ điều hành X

9
Bên cạnh đó, tôi không nghĩ rằng bản thân Mac OS X không phân biệt chữ hoa chữ thường. Thay vào đó, đó là hệ thống tập tin xác định độ nhạy trường hợp. Khi định dạng phân vùng HFS +, người dùng có thể chọn phân biệt chữ hoa hay chữ thường. Trường hợp không nhạy cảm là mặc định.
spaaarky21

225
Có vẻ như rất đáng chú ý trong câu trả lời này rằng việc đặt tùy chọn này thành falsemột hệ thống tệp không phân biệt chữ hoa chữ thường là một ý tưởng tồi . Điều này không nhất thiết phải rõ ràng. Ví dụ, tôi vừa thử cái này trên máy Mac, nghĩ rằng nó sẽ khắc phục vấn đề của tôi, sau đó đổi tên một tệp từ productPageCtrl.jsthành ProductPageCtrl.js. git statusthấy một tập tin mới được gọi ProductPageCtrl.jsnhưng không nghĩ rằng nó productPageCtrl.jsđã bị xóa. Khi tôi thêm các tệp mới, đã cam kết và được đẩy lên GitHub, repo GitHub hiện chứa cả hai tệp mặc dù repo cục bộ (được cho là cập nhật) của tôi chỉ có một.
Mark Amery

5
@MarkAmery Nghe có vẻ giống như một lỗi trong ứng dụng khách Git của bạn. Bạn đã nộp báo cáo?
Domi

24
@Domi đây không phải là một lỗi, đây là hành vi dự kiến. Trên thực tế, một ý tưởng tồi là đặt điều này thành sai trên hệ thống tệp không nhạy cảm bởi vì đây là điều xảy ra. Lý do tại sao git không thấy tệp chữ thường bị xóa là vì hệ thống tệp không báo cáo nó đã bị xóa vì nó bỏ qua trường hợp trong khi git không với tùy chọn này được đặt thành sai. Không phải là tên tệp không có chữ thường so với chữ hoa trên ntfs hoặc chất béo, chỉ cần tra cứu tên tệp là bỏ qua trường hợp.
ohcibi

15
@Domi git đủ thông minh. Đó là lý do tại sao bạn không nên đặt thành sai trên hệ thống tệp không nhạy cảm. Sử dụng git mvđể di chuyển tệp và xem cách git quản lý nó. Nếu bạn di chuyển tệp mà không có git, không có git có thể làm vì hệ thống tệp không nói sự thật với git. Đây là một vấn đề của ntfs / fat / hfs và thelike chứ không phải git / linux.
ohcibi

158

Sử dụng SourceTree tôi đã có thể làm tất cả điều này từ UI

  1. Đổi tên FILE.ext thànhwhatever.ext
  2. Giai đoạn tập tin đó
  3. Bây giờ đổi tên whatever.ext thànhfile.ext
  4. Giai đoạn tập tin đó một lần nữa

Hơi tẻ nhạt, nhưng nếu bạn chỉ cần thực hiện một vài tệp thì sẽ khá nhanh


5
Tương tự với git bash
Alex78191

3
"Giai đoạn tập tin" là phần quan trọng - không có câu trả lời nào khác ở trên có hiệu quả với tôi. Nó thực sự hoạt động với dấu nhắc lệnh Windows cũ đơn giản.
Vlad Sabev

1
Tôi đã không nhận ra điều này làm việc thông qua khu vực tổ chức. Nhưng trong trường hợp của tôi, tôi muốn sửa đổi tên thư mục cũng như một số tệp trong các thư mục đó. Vì vậy, trước tiên tôi đổi tên tất cả các thư mục thành tên tạm thời. Đã cam kết tên mới (tất cả các tệp trong) và các tệp "đã xóa". Git đã gắn cờ tất cả chúng là "đổi tên". Sau đó đổi tên tất cả các thư mục đó trở lại phiên bản trường hợp mới của chúng và cam kết lại. Cuối cùng, hợp nhất 2 cam kết đó. Nhưng dựa trên những gì bạn đã viết, tôi có thể trực tiếp thực hiện toàn bộ thông qua khu vực định cỡ mà không cần tạo 2 cam kết + hợp nhất.
ThermoX

3
Hoạt động với gitkraken trên tên thư mục.
Philippe Matray

Tôi đã viết Script Python 3 để thực hiện công việc tẻ nhạt này: stackoverflow.com/a/58159822/4934640
người dùng

126

Đây là những gì tôi đã làm trên OS X:

git mv File file.tmp
git mv file.tmp file

Hai bước vì nếu không, tôi nhận được một tập tin trên mạng tồn tại lỗi. Có lẽ nó có thể được thực hiện trong một bước bằng cách thêm --cachedhoặc như vậy.


21
như câu trả lời hàng đầu cho thấy, -f(lực lượng) là lá cờ bạn đang tìm kiếm
rperryng

5
@rperryng - không, -fcờ không giúp ích gì trong trường hợp FS cơ bản không phân biệt chữ hoa chữ thường. Tuy nhiên, giải pháp hai bước đã có hiệu quả với tôi
HEKTO

Sử dụng một FS không phân biệt chữ hoa chữ thường (trên Mac) và -fđã hoạt động! Cảm ơn vì tiền boa
caesarsol

Điều này cũng làm việc với một thư mục trên các cửa sổ mà không có -fcờ.
nich

git -c "core.ignorecase=false" add .sẽ xem xét các tệp có trường hợp đã được thay đổi cho cam kết.
nietonfir

67

Đôi khi rất hữu ích khi tạm thời thay đổi độ nhạy trường hợp của Git:

Phương pháp # 1 - Thay đổi độ nhạy trường hợp cho một lệnh:

git -c core.ignorecase=true checkout mybranchđể tắt phân biệt chữ hoa chữ thường cho một checkoutlệnh. Hay nói chung hơn : . (Tín dụng cho VonC để đề xuất điều này trong các bình luận.)git -c core.ignorecase= <<true or false>> <<command>>

Phương pháp # 2 - Thay đổi độ nhạy trường hợp cho nhiều lệnh:

Để thay đổi cài đặt lâu hơn (ví dụ: nếu cần chạy nhiều lệnh trước khi thay đổi lại):

  1. git config core.ignorecase(cái này trả về cài đặt hiện tại, vd false).
  2. git config core.ignorecase <<true or false>> - thiết lập cài đặt mới mong muốn.
  3. ... Chạy nhiều lệnh khác ...
  4. git config core.ignorecase <<false or true>> - đặt giá trị cấu hình trở lại cài đặt trước đó.

1
Tại sao không trực tiếp git -c core.ignorecase=<true or false> checkout <<branch>>? Không có gì để thiết lập lại sau.
VonC

2
Tôi đã có một trải nghiệm kỳ lạ về đề xuất core.ignorecase khi thay đổi từ chữ thường sang chữ hoa, nhưng không phải chữ hoa thành chữ thường. có vẻ như giải pháp đáng tin cậy duy nhất là ngừng sử dụng HĐH mà không nhận ra trường hợp tên tệp.
aspiresGuru

Có một lý do tại sao nó nên là một sự thay đổi tạm thời? Điều đó có gây ra vấn đề gì không nếu tôi chỉ thay đổi cài đặt thành phân biệt chữ hoa chữ thường?
cytsunny

Điều này có thể phụ thuộc vào một vài yếu tố, đặc biệt là liệu hệ thống tệp mục tiêu có phân biệt chữ hoa chữ thường hay không - xem en.wikipedia.org/wiki/Case_sensergy#In_filesystems . Thay đổi tạm thời có thể cần thiết nếu hệ thống tệp triển khai có độ nhạy trường hợp khác với hệ thống tệp được sử dụng để phát triển. Ngoài ra trong trường hợp của tôi, tôi làm việc trong một nhóm nơi mọi người được mong đợi có cùng cài đặt Git (nghĩa là phân biệt chữ hoa chữ thường) vì vậy nếu tôi tắt nó thì cần phải tạm thời.
Steve Chambers

44

Trong OSX, để tránh sự cố này và tránh các vấn đề khác khi phát triển trên hệ thống tệp không phân biệt chữ hoa chữ thường, bạn có thể sử dụng Disk Utility để tạo hình ảnh ổ đĩa / ổ đĩa ảo nhạy .

Chạy tiện ích đĩa, tạo hình ảnh đĩa mới và sử dụng các cài đặt sau (hoặc thay đổi tùy thích, nhưng giữ cho trường hợp nhạy cảm):

Ảnh chụp màn hình tiện ích Mac Disk

Hãy chắc chắn để nói với git rằng bây giờ nó là một trường hợp nhạy cảm với FS:

git config core.ignorecase false

15
Không, hạt nhân đang chạy một ổ đĩa khởi động phân biệt chữ hoa chữ thường trên OSX. Bạn sẽ phải sống mà không có các ứng dụng (ahem, Adobe) được viết kém hoặc chạy các ứng dụng trong VM ngu ngốc của riêng họ, nhưng nó đáng giá nếu bạn mã hóa chủ yếu cho các hệ thống * nix.
Mike Marcacci

1
Đây là lựa chọn duy nhất hoạt động đúng. Tôi đã thử phần còn lại và bạn kết thúc bằng cách này hay cách khác. Giải quyết vấn đề đúng bằng cách làm điều này.
John Hunt

2
Lưu ý rằng Disk Utility có lỗi OS X 10.11 - Nó sẽ không tạo ra hình ảnh phân biệt chữ hoa chữ thường. Bạn cần sử dụng công cụ dòng lệnh hdiutil. apple.stackexchange.com/questions/217915/ Cách
dellsala

7
Với APFS ở High Sierra, điều này thậm chí còn dễ dàng hơn. Nhấp vào biểu tượng của một ổ đĩa có dấu cộng và thêm âm lượng phân biệt chữ hoa chữ thường không có giới hạn về kích thước. Nó chỉ chia sẻ không gian với âm lượng chính và gắn kết tại / Khối lượng / tên âm lượng.
Michael Fox

21

Tôi đã thử các giải pháp sau đây từ các câu trả lời khác và chúng không hoạt động:

Nếu kho lưu trữ của bạn được lưu trữ từ xa (GitHub, GitLab, BitBucket), bạn có thể đổi tên tệp trên nguồn gốc (GitHub.com) và buộc đổi tên tệp theo cách từ trên xuống.

Các hướng dẫn bên dưới liên quan đến GitHub, tuy nhiên ý tưởng chung đằng sau chúng nên áp dụng cho bất kỳ nền tảng lưu trữ lưu trữ từ xa nào. Hãy ghi nhớ loại tệp bạn đang cố đổi tên các vấn đề, nghĩa là, đó có phải là loại tệp mà GitHub cho là có thể chỉnh sửa (mã, văn bản, v.v.) hoặc không thể chỉnh sửa (hình ảnh, nhị phân, v.v.) trong trình duyệt.

  1. Truy cập GitHub.com
  2. Điều hướng đến kho lưu trữ của bạn trên GitHub.com và chọn chi nhánh bạn đang làm việc
  3. Sử dụng công cụ điều hướng tệp của trang web, điều hướng đến tệp bạn định đổi tên
  4. GitHub có cho phép bạn chỉnh sửa tệp trong trình duyệt không?
    • a.) Có thể chỉnh sửa
      1. Nhấp vào biểu tượng "Chỉnh sửa tệp này" (trông giống như một cây bút chì)
      2. Thay đổi tên tệp trong kiểu nhập văn bản tên tệp
    • b.) Không thể chỉnh sửa
      1. Mở nút "Tải xuống" trong tab mới và lưu tệp vào máy tính của bạn
      2. Đổi tên tập tin đã tải xuống
      3. Trong tab trước trên GitHub.com, nhấp vào biểu tượng "Xóa tệp này" (trông giống như thùng rác)
      4. Đảm bảo branchnamenút radio "Cam kết trực tiếp với chi nhánh" được chọn và nhấp vào nút "Cam kết thay đổi"
      5. Trong cùng thư mục trên GitHub.com, nhấp vào nút "Tải tệp lên"
      6. Tải lên tệp đã đổi tên từ máy tính của bạn
  5. Đảm bảo branchnamenút radio "Cam kết trực tiếp với chi nhánh" được chọn và nhấp vào nút "Cam kết thay đổi"
  6. Tại địa phương, thanh toán / tìm nạp / kéo chi nhánh
  7. Làm xong

Tôi đã đổi tên trực tiếp trên BitBucket và nó đã hoạt động. Cảm ơn.
rsc

Tốt để biết. Về mặt lý thuyết, kỹ thuật này sẽ hoạt động trên bất kỳ nền tảng lưu trữ kho lưu trữ nào nhưng tôi muốn biết liệu có bất kỳ nền tảng nào không hoạt động được không.
gmeben

Không hoạt động đối với các tệp không thể chỉnh sửa trong trình duyệt, như hình ảnh hoặc PDF; Không có tùy chọn chỉnh sửa, rõ ràng.
Abhijit Sarkar

@AbhijitSarkar Điểm tốt. Tôi cập nhật câu trả lời của tôi cho những trường hợp. Tôi đã thử nghiệm và xác minh các hướng dẫn làm việc.
gmeben

Bất cứ ai quản lý để đổi tên một thư mục theo cách này?
Solvitieg

20

Tương tự như câu trả lời của @ Sijmen, đây là điều làm việc cho tôi trên OSX khi đổi tên một thư mục (lấy cảm hứng từ câu trả lời này từ một bài đăng khác):

git mv CSS CSS2
git mv CSS2 css

Đơn giản chỉ cần thực hiện git mv CSS cssđã đưa ra lỗi đối số không hợp lệ: fatal: renaming '/static/CSS' failed: Invalid argumentcó lẽ vì hệ thống tệp của OSX không phân biệt chữ hoa chữ thường

ps BTW nếu bạn đang sử dụng Django, collstatic cũng sẽ không nhận ra sự khác biệt của trường hợp và bạn cũng phải thực hiện các thao tác trên, trong thư mục gốc tĩnh


18

1) đổi tên tập tin Name.jpgthànhname1.jpg

2) cam kết xóa tệp Name.jpg

3) đổi tên tập tin name1.jpgthànhname.jpg

4) bổ sung tập tin name.jpgvào cam kết trước đó

git add
git commit --amend

2
Tôi nhận được điều này fatal: bad source, source=name1.jpg, destination=name.jpgở bước 3. Bạn có đề nghị? Thx
Anthony Kong

1
Bạn không thể thực hiện một cam kết, chỉ git add.
Alex78191

Trông rất hack, phải không? Hoặc vá khỉ.
jeromej

18

Tôi đã sử dụng các bước sau:

git rm -r --cached .
git add --all .
git commit -a -m "Versioning untracked files"
git push origin master

Đối với tôi là một giải pháp đơn giản


Đây là giải pháp. Và không giống như các câu trả lời khác, nó hoạt động tốt khi bạn thực hiện đổi tên hàng loạt. Trên glamourphilly.org, chúng tôi cần thay đổi mọi .Jpg thành .jpg. Trong Finder, bạn có thể thực hiện đổi tên hàng loạt như thế và câu trả lời này cho phép bạn kiểm tra nó.
William Entriken

11

Chúng ta có thể sử dụng lệnh git mv. Ví dụ dưới đây, nếu chúng ta đổi tên tệp abcDEF.js thành abcdef.js thì chúng ta có thể chạy lệnh sau từ terminal

git mv -f .\abcDEF.js  .\abcdef.js

8

Mac OSX High Sierra 10.13 sửa lỗi này phần nào. Chỉ cần tạo một phân vùng APFS ảo cho các dự án git của bạn, theo mặc định, nó không có giới hạn kích thước và không có không gian.

  1. Trong Disk Utility, nhấp vào nút + trong khi đĩa Container được chọn
  2. Chọn APFS (Phân biệt chữ hoa chữ thường) theo định dạng
  3. Gọi tên nó Sensitive
  4. Lợi nhuận
  5. Tùy chọn: Tạo một thư mục trong Sensitive được gọi gitln -s /Volumes/Sensitive/git /Users/johndoe/git

Ổ đĩa của bạn sẽ ở trong /Volumes/Sensitive/

nhập mô tả hình ảnh ở đây

Làm cách nào để tôi cam kết thay đổi tên tệp chỉ phân biệt chữ hoa chữ thường trong Git?


Tôi thích đề xuất này, nó thanh lịch và không đau đớn giải quyết vấn đề mà không cần đến các cách giải quyết xấu xí. Cảm ơn!
Phil Gleghorn

4

Tôi đã phải đối mặt với vấn đề này nhiều lần trên MacOS. Git là trường hợp nhạy cảm nhưng Mac chỉ bảo quản trường hợp.

Ai đó cam kết một tập tin: Foobar.javavà sau một vài ngày quyết định đổi tên nó thành FooBar.java. Khi bạn kéo mã mới nhất, nó thất bại vớiThe following untracked working tree files would be overwritten by checkout...

Cách đáng tin cậy duy nhất mà tôi đã thấy khắc phục điều này là:

  1. git rm Foobar.java
  2. Cam kết với một thông điệp mà bạn không thể bỏ lỡ git commit -m 'TEMP COMMIT!!'
  3. Kéo
  4. Điều này sẽ nảy sinh xung đột buộc bạn phải hợp nhất xung đột - vì thay đổi của bạn đã xóa nó, nhưng thay đổi khác đã đổi tên (do đó có vấn đề)
    1. Chấp nhận thay đổi của bạn, đó là 'xóa'
    2. git rebase --continue
  5. Bây giờ thả workaround của bạn git rebase -i HEAD~2dropcácTEMP COMMIT!!
  6. Xác nhận rằng tệp hiện được gọi FooBar.java

3

Khi bạn đã thực hiện rất nhiều lần đổi tên tập tin và một số trong đó chỉ là thay đổi vỏ, thật khó để nhớ đó là tập tin nào. thủ công "git di chuyển" tập tin có thể là một số công việc. Vì vậy, những gì tôi sẽ làm trong quá trình thay đổi tên tệp của mình là:

  1. xóa tất cả các tệp và thư mục không phải git vào một thư mục / kho lưu trữ khác.
  2. cam kết thư mục git trống hiện tại (điều này sẽ hiển thị khi tất cả các tệp đã bị xóa.)
  3. thêm tất cả các tập tin trở lại vào thư mục / kho lưu trữ git ban đầu.
  4. cam kết thư mục git không trống hiện tại.

Điều này sẽ khắc phục tất cả các vấn đề trường hợp mà không cố gắng tìm ra các tập tin hoặc thư mục mà bạn đã đổi tên.


Tại sao không có git commmit --amendtrong đoạn 4? Nếu không, sẽ có thêm một cam kết với việc loại bỏ tất cả các tệp. Hoặc bạn có thể sử dụng git rebase -ivới bí đao.
Alex78191

1

Nếu không có gì hoạt động, sử dụng tên tệp git rm để xóa tệp khỏi đĩa và thêm lại.


0

Tôi đã lấy câu trả lời @CBarr và viết một Python 3 Script để làm điều đó với một danh sách các tệp:

#!/usr/bin/env python3
# -*- coding: UTF-8 -*-

import os
import shlex
import subprocess

def run_command(absolute_path, command_name):
    print( "Running", command_name, absolute_path )

    command = shlex.split( command_name )
    command_line_interface = subprocess.Popen( 
          command, stdout=subprocess.PIPE, cwd=absolute_path )

    output = command_line_interface.communicate()[0]
    print( output )

    if command_line_interface.returncode != 0:
        raise RuntimeError( "A process exited with the error '%s'..." % ( 
              command_line_interface.returncode ) )

def main():
    FILENAMES_MAPPING = \
    [
        (r"F:\\SublimeText\\Data", r"README.MD", r"README.md"),
        (r"F:\\SublimeText\\Data\\Packages\\Alignment", r"readme.md", r"README.md"),
        (r"F:\\SublimeText\\Data\\Packages\\AmxxEditor", r"README.MD", r"README.md"),
    ]

    for absolute_path, oldname, newname in FILENAMES_MAPPING:
        run_command( absolute_path, "git mv '%s' '%s1'" % ( oldname, newname ) )
        run_command( absolute_path, "git add '%s1'" % ( newname ) )
        run_command( absolute_path, 
             "git commit -m 'Normalized the \'%s\' with case-sensitive name'" % (
              newname ) )

        run_command( absolute_path, "git mv '%s1' '%s'" % ( newname, newname ) )
        run_command( absolute_path, "git add '%s'" % ( newname ) )
        run_command( absolute_path, "git commit --amend --no-edit" )

if __name__ == "__main__":
    main()
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.