etc./StackOverFlow

Git에서 대소문자만 구분하는 파일 이름 변경을 커밋하려면 어떻게 해야 합니까?

청렴결백한 만능 재주꾼 2022. 1. 8. 01:38
반응형

질문자 :Gil Shulman


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



폴더가 아닌 파일의 이름을 바꾸는 한 git mv 를 사용할 수 있습니다.

 git mv -f yOuRfIlEnAmE yourfilename

(Git 2.0.1 의 변경 -f 플래그는 불필요하지만 이전 Git 버전에서는 필요했습니다.)


Keith Smiley

Git에는 대소문자를 구분할지 또는 구분하지 않는 파일 시스템을 예상할지 알려주는 구성 설정이 있습니다. core.ignorecase . Git이 대소문자를 구분하도록 하려면 이 설정을 false 설정하기만 하면 됩니다. (이미 파일을 푸시한 경우 다른 답변이 주어지면 먼저 파일을 이동해야 합니다.)

 git config core.ignorecase false

대소문자를 구분하지 않는 파일 시스템에서 이 옵션을 false로 설정하는 것은 일반적으로 좋지 않습니다. 그렇게 하면 이상한 오류가 발생합니다. 예를 들어, 대소문자만 변경하는 방식으로 파일 이름을 바꾸면 git이 가짜 충돌을 보고하거나 중복 파일을 생성하게 됩니다 (Mark Amery의 설명에서) .

선적 서류 비치

git config 문서에서 :

core.ignorecase

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

기본값은 false입니다. 단, git-clone(1) 또는 git-init(1) 은 리포지토리가 생성될 때 해당되는 경우 core.ignorecase 를 조사하고 설정합니다.

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

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

  • OS X

user456814

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

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

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


CBarr

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

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

그렇지 않으면 "파일 존재" 오류가 발생하기 때문에 두 단계. --cached 등을 추가하여 한 번에 완료할 수 있습니다.


Sijmen Mulder

때때로 Git의 대소문자 구분 을 일시적으로 변경하는 것이 유용합니다.

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

git -c core.ignorecase=true checkout mybranch checkout 명령에 대한 대소문자 구분을 끕니다. 또는 더 일반적으로: git -c core.ignorecase= <<true or false>> <<command>> . (의견에서 이를 제안한 VonC에게 감사를 표합니다.)

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

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

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

Steve Chambers

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

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

나를 위해 간단한 솔루션


andrewvergel

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

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

Mac 디스크 유틸리티 스크린샷

이제 대소문자를 구분하는 FS에 있음을 git에 알려주십시오.

 git config core.ignorecase false

user1821510

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

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

user4987870

@Sijmen의 답변과 유사하게 이것은 디렉토리 이름을 바꿀 때 OSX에서 저에게 효과적이었습니다(다른 게시물의 답변에서 영감을 얻었습니다).

 git mv CSS CSS2 git mv CSS2 css

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

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


Anupam

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

저장소가 원격으로 호스팅되는 경우(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. 완료

gmeben

  1. 파일의 이름을 변경 Name.jpgname1.jpg

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

  3. 이름 바꾸기 파일 name1.jpgname.jpg

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

     git add name.jpg git commit --amend

razon

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

  1. 디스크 유틸리티에서 컨테이너 디스크가 선택된 상태에서 + 버튼을 클릭합니다.
  2. 형식에서 APFS(대소문자 구분)를 선택합니다.
  3. Sensitive 이름으로 지정
  4. 이익
  5. 선택 사항: Sensitive에 gitln -s /Volumes/Sensitive/git /Users/johndoe/git

드라이브는 /Volumes/Sensitive/

여기에 이미지 설명 입력

Git에서 대소문자를 구분하는 파일 이름 변경만 커밋하려면 어떻게 해야 합니까?


Ray Foss

파일 이름 변경을 많이 하고 그 중 일부가 대소문자만 변경되면 어느 것이 어느 것인지 기억하기 어렵습니다. 파일을 수동으로 "git 이동"하는 것은 꽤 많은 작업이 될 수 있습니다. 따라서 파일 이름 변경 작업 중에 수행할 작업은 다음과 같습니다.

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

이렇게 하면 이름을 바꾼 파일이나 폴더를 알아내지 않고도 모든 케이스 문제를 해결할 수 있습니다.


Ricardo Virtudazo Jr

MacOS에서 이 문제에 여러 번 직면했습니다. Git은 대소문자를 구분하지만 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~2drop 하고 TEMP COMMIT!!
  6. 이제 파일 이름이 FooBar.java

Ashwin Jayaprakash

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


gopal Pandey

@CBarr 답변을 받고 Python 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()

user

출처 : http:www.stackoverflow.com/questions/17683458/how-do-i-commit-case-sensitive-only-filename-changes-in-git

반응형