자식 mv와 디렉토리의 경우 만 변경


259

비슷한 질문 을했지만 내 문제에 대한 답을 찾지 못했습니다

내가 디렉토리를 FOO에서 foo로 바꾸려고 git mv FOO foo하면

fatal: renaming 'FOO' failed: Invalid argument

확인. 그래서 시도합니다git mv FOO foo2 && git mv foo2 foo

그러나 내가 통해 커밋하려고 git commit .하면

# On branch master
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
# foo
nothing added to commit but untracked files present (use "git add" to track)

git add foo아무것도 변경하지 않고 디렉토리를 추가하면 git commit .동일한 메시지가 다시 나타납니다.

내가 뭘 잘못하고 있죠? 대소 문자 구분 시스템 (OSX)을 사용하고 있다고 생각했는데 왜 단순히 디렉토리 이름을 바꿀 수 없습니까?


10
OS X의 파일 시스템은 대소 문자를 구분하지 않습니다.
mipadi 2016 년

2
@mipadi 대소 문자 구분 모드에서 작동 할 수 있지만 일반적으로 기본적으로 꺼져 있습니다.
GordonM

1
이 질문과 답변은 Windows에서도 유용합니다. "osx"태그를 해제하는 것을 고려하십시오
Barett

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

git mv foo Foocygwin 쉘을 사용하는 경우 Windows에서 일반 을 사용할 수 있습니다.
앤드류 스콧

답변:


409

대소 문자를 구분하지 않는 환경에 있습니다. 또한 Git이 이해 -A하는 mv것처럼 제거 기능을 추가 하지 않아도 제거 측면을 처리하지 않습니다 . 경고! 이 작업을 수행 할 때 다른 변경 사항이나 추적되지 않은 파일이 없는지 확인하십시오. 그렇지 않으면이 변경 사항의 일부로 커밋됩니다. git stash -u먼저이 작업을 수행 한 다음 수행하십시오 git stash pop. 계속 :이 문제를 해결하려면 다음을 수행하십시오.

mv foo foo2
git add -A
git commit -m "renaming"
mv foo2 FOO
git add -A
git commit --amend -m "renamed foo to FOO"

이것이 작업 디렉토리를 변경하고 커밋 한 다음 두 커밋을 축소하는 방법입니다. 인덱스에서 파일을 옮길 수는 있지만 git을 처음 접하는 사람에게는 무슨 일이 일어나고 있는지 명확하지 않을 수 있습니다. 더 짧은 버전은

git mv foo foo2
git mv foo2 FOO
git commit -m "changed case of dir"

의견 중 하나에서 제안한 것처럼 대화 형 리베이스 ( git rebase -i HEAD~5잘못된 커밋이 5 커밋 전에 도입 된 경우)를 수행하여 사례를 수정하고 히스토리의 어느 곳에도 잘못된 케이스가 나타나지 않도록 할 수 있습니다. 커밋 해시가 다르고 다른 사람들이 최근의 지사와 함께 작업을 리베이스하거나 다시 병합해야하기 때문에이 작업을 수행하면주의해야합니다.

이것은 파일 이름 수정과 관련이 있습니다 : git은 대소 문자를 구분하지 않습니까?


1
감사. 이것은 나를 미치게했다. -A 또는 --amend 옵션에 대해 몰랐습니다.
oschrenk 2016 년

7
추적되지 않은 항목을 포함하여 현재 디렉토리의 모든 컨텐츠를 재귀 적으로 추가하므로 -A에주의하십시오. 그냥 더 나을 수도 있습니다 git add foo2.
rich.e

2
맞아요. 그러나 foo2 제거와 FOO 추가를 모두 별도로 준비해야합니다. -A둘 다 처리합니다. 첫 번째 단계의 반대의 경우도 마찬가지입니다. 경고를 추가하겠습니다. 감사!
Adam Dymitruk

대화식 rebase를 사용하여 히스토리를 정리할 수도 있습니다 git rebase -i HEAD~2. 참고 :이를 단순화하려면 첫 번째 커밋에서 마지막 메시지를 설정하고 두 번째 커밋을 수정하십시오.
Alex B.

5
나는 git mv foo foo2로 성공했다. git mv foo2 FOO; 자식 커밋
Chris

146

옵션 core.ignorecase을 false 로 설정하려고 하면 Git이 기본적으로 지원하지 않는 파일 시스템의 경우에주의를 기울입니다. 리포지토리에서 활성화하려면 :

$ git config core.ignorecase false

그런 다음 파일 이름을 바꿀 수 git mv있으며 예상대로 작동합니다.


1
나는 이것이 다른 곳에서 바람직하지 않은 영향을 미칠 수 있다고 생각합니다. 대소 문자를 구분하지 않는 시스템은 Git이 동일한 디렉토리라고 생각해야합니다.
Adam Dymitruk 2016 년

2
옵션을 전역 설정에 추가했지만 도움이되지 않았습니다.
oschrenk

3
OSX에서 이것을 사용하는 이상한 행동을 봅니다. hrm I modified a file that doesn't exist.. hrm error: The following untracked working tree files would be overwritten by checkout:그러나 ... 해당 파일이 없습니다.
Skylar Saveland

이것은 내가 찾던 것입니다. CentOS 5.6을 실행 중이며 변경 사항이 적용되지 않았습니다.
crmpicco

5
작동하지 않습니다! Git 1.8.3에서 Git은 이름이 바뀐 파일을 제거 + 추가하는 대신 새 파일로 취급합니다. 커밋하면 foo와 FOO가 같은 두 개의 동일한 파일이있는 리포지토리가 남습니다! 그러나 체크 아웃 할 때 하나의 파일 만 표시되지만 한 경우는 다른 경우보다 우세 할 수 있습니다.
Johnny Wong

68

임시 파일 이름을 사용하여 git 1.7.7을 사용 하여이 문제를 해결할 수있었습니다.

$ git mv improper_Case improve_case2
$ git mv improve_case2 improve_case
$ git commit -m "<your message>"

흥미 롭군 아마도 GIT는 그 이후로 무언가를 개선했을 것입니다. 이 문제를 다시 발견하면 다시 시도하겠습니다.
oschrenk

훨씬 쉬운 방법
olore

macOS에서 나를 위해 일했습니다.
Mr_Pouet

14

( git mv무료 변형)

Mac OS X 10.9의 Git 에서이 문제가 발생했습니다. 나는 다음과 같이 해결했다.

git rm -r --cached /path/to/directory

Git에서 삭제할 디렉토리를 준비하지만 실제로 실제 파일을 제거하지는 않습니다 ( --cached). 또한 적절한 경우 디렉토리가 추적되지 않은 파일에 표시됩니다.

그래서 당신은 이것을 할 수 있습니다 :

mv /path/to/directory /path/to/DIRECTORY
git add -A /path/to/DIRECTORY

그런 다음 Git은 파일 이름을 변경했음을 인식 git status하고 여러 renamed:줄을 보게 됩니다. 그것들을 검사하고 그것들이 올바르게 보이는지 확인하고, 그렇다면 정상적으로 변경 사항을 커밋 할 수 있습니다.


mv실제로 디렉토리 이름을 바꾸는 명령이 작동하지 않는다는 것을 알았습니다 . Finder 내에서 이름을 바꿔야했습니다. 그 외에는이 수정 프로그램이 완벽하게 작동합니다.
Adam S

9

빠르고 안전합니다.

git mv -f path/to/foo/* path/to/FOO/

경고! 이름이 바뀐 폴더에있는 모든 파일의 이름을 항상 바꿉니다 (사용 /*).

단일 파일의 이름을 바꾸지 마십시오. 이것은이 답변에 설명 된 버그로 이어집니다 .

먼저 결과를 먼저 보려면 다음을 사용하십시오 -n.

git mv -f -n path/to/foo/* path/to/FOO/

당신이 만든 후 mv:

  1. 커밋 변경
  2. 다른 개정에 대한 체크 아웃
  3. 다시 확인하십시오.

이제 Git은 내부 파일과 파일 시스템에서 BOTH 폴더의 이름을 변경해야합니다.


위의 질문 의견에서 언급했듯이 Git 2.0.1에만 해당됩니까? ( stackoverflow.com/a/24979063/6309 참조 )
VonC 2016 년

8

-f 옵션으로 강제 실행하십시오.

git mv -f FOO foo

나를 위해 작동하지 않습니다. 내 설정은 .git / config의 "ignorecase = true"입니다. 이 방법으로 스테이징 영역에서 이름 바꾸기를 스테이징 할 수 없습니다. (Git 버전 1.8.3.msysgit.0) Adam Dymitruk의 솔루션이 유일한 해결책입니다.
Johnny Wong

@JohnnyWong 당신의 설정을 변경 false, 그것은 나를 위해 일했다
Inder Kumar Rathore

그러면 컴퓨터가 대소 문자를 무시하도록 설정되어 있어도 다른 모든 사용자의 컴퓨터가 당겨지면 업데이트됩니까?
브라이스

@Bryce 아니요, 다른 사용자가 변경 사항을 가져 오기 전에 변경 사항을 커밋하고 중앙 저장소로 푸시해야합니다.
konyak

3

하나의 관련 문제가있었습니다.

하나의 폴더는 'Pro'(처음 생성됨)이고 다른 하나는 'pro'(실수로 생성됨)입니다. Mac에서는 똑같지 만 git에 따라 다릅니다.

$ git config core.ignorecase false

git config는 파일의 이름을 오른쪽 폴더 (감사)로 바꾸고 'pro'(No !!)에 고스트 파일을 만들었습니다. 나는 고스트 파일 변경 사항을 트랙에 추가 할 수 없었고 그 파일을 나와 함께 가지고 다니지 않으면 다른 지점을 체크 아웃 할 수 없었으며 어떻게 든 재설정 할 수 없었습니다.

그 대신에, 나는했다

$ git rm -r --cached pro
$ git status // => pro files removed, new Pro files untracked
$ git add Pro

추가 안전을 위해 별도의 수정 지점에서 수행 한 다음 기본 지점으로 다시 병합했습니다.

님이 만든 고스트 파일 문제에 대해 전문가가 방법과 이유를 설명 할 수 있습니까? 미리 감사드립니다.


2

명시 적으로 선택하지 않으면 OS X에서 대소 문자 구분 파일 시스템을 사용하지 않습니다. HFS + 대소 문자를 구분할 있지만 기본값은 대소 문자를 구분하지 않습니다.


4
OS X에서 대소 문자 구분 파일 시스템을 사용하는 것은 좋지 않습니다. 많은 앱이 제대로 작동하지 않습니다. 특정 문제 중 하나는 Adobe Photoshop에서 대소 문자 구분 파일 시스템이 지원되지 않는다는 설치를 거부한다는 것입니다.
jpswain

1

이 페이지의 모든 gitfoo에 대한 정말 간단한 해결책이 있습니다.

  1. 프로젝트에서 파일을 수동으로 복사하십시오.
  2. git rm 모든 파일.
  3. git commit은 정상적으로 작동합니다.
  4. 파일을 수동으로 다시 추가하십시오.
  5. 자식은 모든 파일을 추가합니다.
  6. git commit은 정상적으로 작동합니다.
  7. 이익.

1
이것은 로컬에서 작동하지만 다른 사람이 당기면 케이스가 변경되지 않습니다.
Jason

다른 경우와 함께 git에서 이중 항목을 수정하는 데 도움을 주셔서 감사합니다. 나는 이것의 변형을 사용했다. 부모 폴더의 이름을 바꿨습니다. 커밋했습니다. 그런 다음 상위 폴더의 이름을 다시 원래 폴더로 바꿉니다. 그리고 두 번째 커밋을했습니다. 이제 대소 문자가 다른 이전 항목이 사라졌습니다.
dreamerkumar

0

"git mv"를 사용하여 Adam Dymitruk의 답변을 개선하면 (SO는 자신의 답변에 대해 언급하지 않습니다), 자동으로 이동 된 파일을 스테이징합니다. 스 태싱이 필요하지 않으며 위험한 "git add -A"를 피할 수 있습니다.

old="abc";    new="ABC";
tmp="$old-renamed";
git mv "$old" "$tmp";
git commit -m "Renamed '$old' to '$tmp'.";
git mv "$tmp" "$new";
git commit --amend -m "Renamed '$old' to '$new'.";

0

이것은 Windows에서 나에게 효과적이었습니다. 다음과 함께 Powershell을 사용했습니다.

  1. mv .\Folder-With-Wrong-Casing .\temp
  2. git add -A
  3. git commit -m "renamed folder with wrong casing to temp"
  4. mv .\temp .\Folder-with-Correct-Casing
  5. git add -A
  6. git commit --amend -m "Renamed to proper casing"
  7. (선택 과목) git push

위의 Adam의 답변에 감사드립니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.