Git에서 대소 문자를 구분하는 파일 이름 변경 사항을 어떻게 커밋합니까?


1300

나는에 의해 몇 개의 파일 이름을 변경 한에서와 같이 첫 글자, 드 활용 Name.jpg하는 방법에 대해 name.jpg. 힘내는이 변경 사항을 인식하지 못하고 파일을 삭제하고 다시 업로드해야했습니다. 파일 이름의 변경 사항을 확인할 때 Git이 대소 문자를 구분할 수있는 방법이 있습니까? 파일 자체는 변경하지 않았습니다.


4
@nif 이것은 정확하지 않습니다. Git에는 실제로 대소 문자 구분을 무시할지 여부를 제어하는 ​​구성 설정이 있습니다.


6
stackoverflow.com/a/24979063/6309 : git 2.0.1부터 간단한 git mv작업을 참조하십시오 .
VonC


이 게시물을 참조하십시오. 커밋 할 수는 있었지만 파일 경로없이 매개 변수로 git commit -m "msg"를 사용했습니다. 색인을 업데이트하고 파일을 체크인했습니다. [링크] stackoverflow.com/questions/35790113/…
ARKS

답변:


1513

git mv 사용할 수 있습니다 :

git mv -f OldFileNameCase newfilenamecase

12
이 그렇지 않은 동안 나 '소스 디렉토리가 비어'제공
WiseStrawberry

6
여기서 MacOS (대소 문자를 구분하지 않는 FS)와 -f를 사용했습니다! 팁 주셔서 감사합니다
시저 솔

49
최신 버전에서는 더 이상 -f플래그 가 필요하지 않습니다 .
Joshua Pinter

8
전체 파일 경로를 제공하는 것을 잊지 마십시오.
분명히 알지만

7
최고 투표 의견 : 최신 git (2.18) 이있는 스위치 필요합니다. -f그렇지 않으면 fatal: destination exists오류가 발생할 수 있습니다.
DeepSpace101

1035

Git에는 대 / 소문자를 구분할지 여부를 알려주는 구성 설정이 있습니다 core.ignorecase. Git이 대소 문자를 구분하도록하려면이 설정을 false다음과 같이 설정하십시오 .

git config core.ignorecase false

선적 서류 비치

로부터 git config문서 :

core.ignorecase

true 인 경우이 옵션을 사용하면 다양한 해결 방법을 통해 git이 FAT와 같이 대소 문자를 구분하지 않는 파일 시스템에서 더 잘 작동 할 수 있습니다. 예를 들어, 디렉토리 목록에서 makefilegit이 예상하는 시간을 찾으면 Makefilegit은 파일이 실제로 같은 파일이라고 가정하고 계속로 기억합니다 Makefile.

git-clone (1) 또는 git-init (1)core.ignorecase리포지토리가 생성 될 때 적절한 경우 조사하고 true를 설정 한다는 점을 제외하고 기본값은 false 입니다.

대소 문자를 구분하지 않는 파일 시스템

내가 알고있는 대소 문자를 구분하지 않는 파일 시스템이있는 가장 널리 사용되는 두 가지 운영 체제는

  • 윈도우
  • OS X

9
참고로, Mac OS X 자체는 대소 문자를 구분하지 않는다고 생각합니다. 대신, 대소 문자 구분을 결정하는 파일 시스템입니다. HFS + 파티션을 포맷 할 때 사용자는 대소 문자를 구분할지 또는 구분하지 않을지를 선택할 수 있습니다. 대소 문자를 구분하지 않는 것이 기본값입니다.
spaaarky21

225
이 답변 false에서 대소 문자를 구분하지 않는 파일 시스템 에서이 옵션을 설정 하는 것은 나쁜 생각 입니다. 반드시 분명하지는 않습니다. 예를 들어, 난 그냥 다음에서 파일의 이름을 변경, 내 문제를 해결하는 것입니다 생각, 내 맥이 시도 productPageCtrl.jsProductPageCtrl.js. git status새로운 라는 파일을 ProductPageCtrl.js하지만, 하지 않은 그 생각 productPageCtrl.js이 삭제되었다. 새 파일을 추가하고 커밋하고 GitHub에 푸시했을 때 GitHub 저장소에는 로컬 저장소에 하나만 있었지만 파일이 모두 포함되었습니다 .
Mark Amery

5
@MarkAmery Git 클라이언트의 버그처럼 들립니다. 보고서를 제출 했습니까?
Domi

24
@Domi 이것은 버그가 아니며 예상되는 동작입니다. 실제로 이런 일이 일어나기 때문에 민감하지 않은 파일 시스템에서 이것을 false로 설정하는 것은 좋지 않습니다. git이 소문자 파일이 삭제 된 것을 보지 못한 이유는 파일 시스템이 git이이 옵션을 false로 설정하지 않은 경우를 무시 하고 대소 문자를 무시 하므로 삭제 된 것으로보고하지 않기 때문 입니다. 파일 이름이 ntfs에서 소문자 대 대문자를 가지지 않거나 지방이 아닌 것은 파일 이름 조회가 대소 문자를 무시하는 것입니다.
ohcibi 2016 년

15
@Domi git 충분히 똑똑합니다. 따라서 대소 문자를 구분하지 않는 파일 시스템에서이를 false로 설정 하지 않아야 합니다. git mv파일을 이동하고 git이 파일을 관리하는 방법을 보는 데 사용하십시오 . 당신이 자식없이 파일을 이동하는 경우가 아무것도 파일 시스템이 자식에게 진실을 말하고되지 않는 자식이 할 수 있습니다. 이것은 git / linux가 아닌 ntfs / fat / hfs의 문제입니다.
ohcibi 2016 년

157

SourceTree를 사용하여 UI 에서이 모든 것을 할 수있었습니다.

  1. 이름 바꾸기 FILE.extwhatever.ext
  2. 스테이지 해당 파일을
  3. 이제 이름 whatever.extfile.ext
  4. 스테이지 다시 파일을

약간 지루하지만 몇 개의 파일로만 수행 해야하는 경우 매우 빠릅니다.


5
git bash와 동일
Alex78191

3
"Stage that file"은 중요한 부분입니다-위의 다른 답변들 중 어느 것도 나를 위해 일하지 않았습니다. 실제로 일반 Windows 명령 프롬프트에서 작동했습니다.
Vlad Sabev

1
나는 이것이 스테이징 영역을 통해 작동한다는 것을 몰랐습니다. 그러나 필자의 경우 폴더 이름과 해당 폴더 내의 일부 파일을 수정하고 싶었습니다. 먼저 모든 폴더의 이름을 임시 이름으로 바꿨습니다. 새 이름 (내의 모든 파일)과 "삭제 된"파일을 커밋했습니다. 힘내는 그들 모두를 "이름이 바뀐"것으로 표시했다. 그런 다음 모든 폴더의 이름을 새 사례 버전으로 바꾸고 다시 커밋했습니다. 마지막으로 그 두 커밋을 병합했습니다. 그러나 당신이 쓴 것을 기반으로, 2 개의 커밋 + 병합을 만들지 않고 사이 팅 영역을 통해 모든 것을 직접 수행 할 수있었습니다.
ThermoX

3
폴더 이름에서 gitkraken과 함께 작동합니다.
Philippe Matray

이 지루한 작업을 수행하기 위해 Python 3 스크립트를 작성했습니다. stackoverflow.com/a/58159822/4934640
사용자

126

이것이 내가 OS X에서 한 일입니다.

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

그렇지 않으면 "파일이 있습니다"오류가 발생하여 두 단계가 수행됩니다. 아마도 추가 --cached또는 이와 같은 방법으로 한 단계에서 수행 할 수 있습니다 .


21
최고 답변에서 알 수 있듯이 -f(force)는 당신이 찾고있는 깃발입니다.
rperryng

5
@rperryng-아니요, -f기본 FS가 대소 문자를 구분하지 않는 경우 플래그가 도움이되지 않습니다. 그러나 2 단계 솔루션은 저에게
효과적

대소 문자를 구분하지 않는 FS (Mac)를 사용하여 -f작동했습니다! 팁 주셔서 감사합니다
시저 솔

이것은 -f플래그가 없는 Windows의 폴더에서도 작동했습니다 .
nich

git -c "core.ignorecase=false" add .커밋을 위해 케이스가 변경된 파일을 고려합니다.
nietonfir 2013

67

Git의 대 / 소문자 구분 을 일시적으로 변경하는 것이 유용한 경우가 있습니다.

방법 # 1-단일 명령에 대한 대소 문자 구분 변경 :

git -c core.ignorecase=true checkout mybranch단일 checkout명령에 대해 대소 문자 구분을 해제 합니다. 또는보다 일반적으로 : . (의견에 이것을 제안한 VonC의 공로)git -c core.ignorecase= <<true or false>> <<command>>

방법 # 2-여러 명령의 대소 문자 구분 변경 :

더 오래 설정을 변경하려면 (예 : 다시 변경하기 전에 여러 명령을 실행해야하는 경우) :

  1. git config core.ignorecase(예 : 현재 설정을 반환합니다 false).
  2. git config core.ignorecase <<true or false>> -원하는 새 설정을 지정하십시오.
  3. ... 여러 개의 다른 명령을 실행하십시오 ...
  4. git config core.ignorecase <<false or true>> -구성 값을 이전 설정으로 다시 설정하십시오.

1
왜 직접하지 git -c core.ignorecase=<true or false> checkout <<branch>>않습니까? 후에 재설정 할 것이 없습니다.
VonC

2
소문자에서 대문자로 변경할 때 제안 된 core.ignorecase 작동에 대한 이상한 경험이 있었지만 대문자는 소문자가 아닙니다. 신뢰할 수있는 유일한 해결책은 파일 이름을 인식하지 못하는 OS 사용을 중지하는 것 같습니다.
aspiringGuru

일시적인 변경이 필요한 이유가 있습니까? 설정을 대 / 소문자를 구분하여 그대로두면 문제가 발생합니까?
cytsunny

이는 대상 파일 시스템이 대소 문자를 구분하는지 여부에 따라 몇 가지 요인에 따라 달라질 수 있습니다 ( en.wikipedia.org/wiki/Case_sensitivity#In_filesystems 참조) . 배치 파일 시스템이 개발에 사용 된 파일 시스템에 대해 대소 문자를 구분하는 경우 임시 변경이 필요할 수 있습니다. 또한 제 경우에는 모든 사람이 동일한 Git 설정 (예 : 대소 문자 구분)을 갖도록 예상되는 팀에서 일하므로 전원을 끄면 일시적이어야합니다.
Steve Chambers

44

OSX에서이 문제를 피하고 대소 문자를 구분하지 않는 파일 시스템 개발과 관련된 다른 문제를 피하기 위해 디스크 유틸리티를 사용하여 대소 문자를 구분하는 가상 드라이브 / 디스크 이미지 를 만들 수 있습니다 .

디스크 유틸리티를 실행하고 새 디스크 이미지를 작성하고 다음 설정을 사용하십시오 (또는 원하는대로 변경하지만 대소 문자를 구분하십시오).

맥 디스크 유틸리티

git에게 대소 문자를 구분하는 FS에 있는지 확인하십시오.

git config core.ignorecase false

15
아니, 핵은 OSX에서 대소 문자를 구분하는 부팅 드라이브를 실행하고 있습니다. 제대로 작성되지 않은 앱 (ahem, Adobe)을 사용하지 않고 자신의 사례 바보 VM에서 실행해야하지만, 주로 * nix 시스템 용으로 코딩하는 경우에는 그만한 가치가 있습니다.
Mike Marcacci 1

1
이것이 제대로 작동하는 유일한 옵션입니다. 나는 나머지를 시도했고 당신은 피클로 끝납니다. 이를 수행하여 문제점을 올바르게 해결하십시오.
존 헌트

2
디스크 유틸리티에는 OS X 10.11 버그가 있습니다. 대소 문자 구분 이미지를 만들지 않습니다. 명령 행 도구 hdiutil을 사용해야합니다. apple.stackexchange.com/questions/217915/…
dellsala

7
High Sierra의 APFS를 사용하면 훨씬 쉽습니다. 플러스가있는 드라이브 아이콘을 클릭하고 크기에 제한이없는 대소 문자 구분 볼륨을 추가하십시오. 기본 볼륨과 공간을 공유하고 / Volumes / volume-name에 마운트합니다.
Michael Fox

21

다른 답변에서 다음 솔루션을 시도했지만 작동하지 않았습니다.

리포지토리가 원격으로 호스팅되는 경우 (GitHub, GitLab, BitBucket) 원본에서 파일 이름을 바꾸고 (GitHub.com) 하향식으로 파일 이름을 바꿀 수 있습니다.

아래의 지침은 GitHub와 관련이 있지만, 일반적인 지침은 원격 리포지토리 호스팅 플랫폼에 적용해야합니다. GitHub가 브라우저 내에서 편집 가능 (코드, 텍스트 등) 또는 편집 불가능 (이미지, 이진 등)으로 간주하는 파일 형식인지 여부에 관계없이 이름을 바꾸려는 파일 형식을 명심하십시오.

  1. GitHub.com 방문
  2. GitHub.com의 저장소로 이동하여 작업중인 지점을 선택하십시오.
  3. 사이트의 파일 탐색 도구를 사용하여 이름을 바꾸려는 파일로 이동하십시오.
  4. GitHub에서 브라우저 내에서 파일을 편집 할 수 있습니까?
    • a) 편집 가능
      1. "이 파일 편집"아이콘을 클릭하십시오 (연필 모양).
      2. 파일 이름 텍스트 입력에서 파일 이름 변경
    • b) 편집 불가능
      1. 새 탭에서 "다운로드"버튼을 열고 파일을 컴퓨터에 저장하십시오
      2. 다운로드 한 파일 이름 바꾸기
      3. GitHub.com의 이전 탭에서 "이 파일 삭제"아이콘을 클릭하십시오 (휴지통처럼 보입니다)
      4. " branchname지점에 직접 커밋 "라디오 버튼이 선택되어 있는지 확인하고 " 변경 사항 커밋"버튼을 클릭하십시오.
      5. GitHub.com의 동일한 디렉토리에서 "파일 업로드"버튼을 클릭하십시오
      6. 컴퓨터에서 이름이 바뀐 파일을 업로드하십시오.
  5. " branchname지점에 직접 커밋 "라디오 버튼이 선택되어 있는지 확인하고 " 변경 사항 커밋"버튼을 클릭하십시오.
  6. 현지에서 지점 체크 아웃 / 페치 / 풀
  7. 끝난

BitBucket에서 직접 이름을 바꾸고 작동했습니다. 감사.
rsc

알아 둘만 한. 이 기술은 이론적으로 모든 저장소 호스팅 플랫폼에서 작동해야하지만 작동하지 않는 것이 있는지 알고 싶습니다.
gmeben

이미지 나 PDF와 같이 브라우저에서 편집 할 수없는 파일에는 작동하지 않습니다. 편집 옵션은 없습니다.
Abhijit Sarkar

@AbhijitSarkar 좋은 지적입니다. 그 경우에 대한 답변을 업데이트했습니다. 이 지침이 작동하는지 테스트하고 확인했습니다.
gmeben

누구나 이런 식으로 디렉토리 이름을 바꿀 수 있습니까?
Solvitieg

20

@Sijmen의 답변과 비슷하게 디렉토리 이름을 바꿀 때 OSX에서 나에게 도움 되었습니다 (다른 게시물 의이 답변에서 영감을 얻음 ).

git mv CSS CSS2
git mv CSS2 css

단순히 OSX의 파일 시스템이 대소 문자를 구분하지 않기 때문에 git mv CSS css잘못된 인수 오류가 발생했습니다.fatal: renaming '/static/CSS' failed: Invalid argument

ps BTW Django를 사용하는 경우 collectstatic도 대소 문자 차이를 인식하지 못하며 정적 루트 디렉토리에서도 수동으로 위의 작업을 수행해야합니다


18

1) 파일 이름 Name.jpgname1.jpg

2) 커밋 제거 된 파일 Name.jpg

3) 파일 이름 name1.jpgname.jpg

4) name.jpg이전 커밋에 추가 된 파일 수정

git add
git commit --amend

2
fatal: bad source, source=name1.jpg, destination=name.jpg3 단계 에서이 문제가 발생합니다. 제안이 있습니까? Thx
Anthony Kong

1
커밋을 할 수는 없습니다 git add.
Alex78191

매우 해키 보인다? 또는 원숭이 패치.
jeromej

18

다음 단계를 사용했습니다.

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

나를 위해 간단한 솔루션입니다


이것이 해결책입니다. 다른 답변과 달리 배치 이름 바꾸기를 수행 할 때 잘 작동합니다. glamourphilly.org에서는 모든 .Jpg를 .jpg로 변경해야했습니다. Finder에서 이와 같은 배치 이름 변경을 수행 할 수
있으며이

11

git mv 명령을 사용할 수 있습니다. 아래 예제에서 abcDEF.js 파일의 이름을 abcdef.js로 바꾸면 터미널에서 다음 명령을 실행할 수 있습니다

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

8

Mac OSX High Sierra 10.13이이를 약간 수정합니다. git 프로젝트를위한 가상 APFS 파티션을 만드십시오. 기본적으로 크기 제한이없고 공간이 없습니다.

  1. 디스크 유틸리티에서 컨테이너 디스크를 선택한 상태에서 + 버튼을 클릭하십시오.
  2. 형식에서 APFS (대소 문자 구분)를 선택하십시오.
  3. 이름을 붙이다 Sensitive
  4. 이익
  5. 옵션 : 민감한에서 폴더라는 확인 gitln -s /Volumes/Sensitive/git /Users/johndoe/git

당신의 드라이브는 /Volumes/Sensitive/

여기에 이미지 설명을 입력하십시오

Git에서 대소 문자를 구분하는 파일 이름 변경 사항을 어떻게 커밋합니까?


나는이 제안을 좋아합니다. 추악한 해결 방법을 사용하지 않고 우아하고 고통없이 문제를 해결합니다. 감사!
Phil Gleghorn

4

MacOS 에서이 문제에 여러 번 직면했습니다. 힘내는 대소 문자를 구분하지만 Mac은 대소 문자 만 보존합니다.

누군가 파일을 커밋하고 Foobar.java며칠 후에 파일 이름을로 변경하기로 결정했습니다 FooBar.java. 최신 코드를 가져 오면 실패합니다.The following untracked working tree files would be overwritten by checkout...

내가 본 것을 신뢰할 수있는 유일한 방법은 다음과 같습니다.

  1. git rm Foobar.java
  2. 놓칠 수없는 메시지로 커밋 git commit -m 'TEMP COMMIT!!'
  3. 손잡이
  4. 변경 사항이 삭제 되었으나 다른 변경 사항의 이름이 변경되었으므로 (문제가 발생하므로) 충돌을 병합해야하는 충돌이 발생합니다.
    1. '삭제'인 변경 사항을 수락하십시오.
    2. git rebase --continue
  5. 이제 해결 드롭 git rebase -i HEAD~2dropTEMP COMMIT!!
  6. 파일이 이제 호출되었는지 확인 FooBar.java

3

많은 파일 이름 바꾸기를 수행하고 일부 파일의 이름이 변경되었을 때 어떤 파일인지 기억하기 어렵습니다. 파일을 수동으로 "git moving"하는 것은 꽤 효과가있을 수 있습니다. 따라서 파일 이름 변경 작업 중에 수행 할 작업은 다음과 같습니다.

  1. git이 아닌 모든 파일과 폴더를 다른 폴더 / 저장소로 제거하십시오.
  2. 현재 비어있는 자식 폴더를 커밋하십시오 (모든 파일이 삭제 된 것으로 표시됩니다).
  3. 모든 파일을 원래 git 폴더 / 리포지토리에 다시 추가하십시오.
  4. 비어 있지 않은 현재 자식 폴더를 커밋하십시오.

이렇게하면 이름을 바꾼 파일이나 폴더를 파악하지 않고도 모든 사례 문제가 해결됩니다.


git commmit --amend단락 4에서 왜 그렇지 않습니까? 그렇지 않으면 모든 파일을 제거하여 추가 커밋이 발생합니다. 또는 git rebase -i스쿼시와 함께 사용할 수 있습니다 .
Alex78191

1

아무것도 작동하지 않으면 git rm filename을 사용하여 디스크에서 파일을 삭제하고 다시 추가하십시오.


0

@CBarr 답변을 가져 와서 파일 목록으로 파이썬 3 스크립트를 작성했습니다.

#!/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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.