다른 곳으로 폴더를 이동하는 git 명령


194

common소스 파일과 폴더가 많은 폴더 를 만들었습니다 .

이제 common폴더를 폴더로 옮기고 include싶습니다.include/common

나는 이것을 시도했다 :

  1. git add include

  2. git mv common/ include/

    하지만이 오류로 실패합니다

    치명적 : 잘못된 소스, source = myrepo / common, destination = myrepo / include

  3. 시도 git mv common/ include/common했지만 같은 오류가 발생합니다.

이것을 달성하는 방법에 대한 아이디어가 있습니까?

답변:


177

git의 가장 좋은 점 중 하나는 파일 이름 바꾸기를 명시 적으로 추적 할 필요가 없다는 것입니다. 힘내 파일의 내용을 비교하여 알아낼 것입니다.

따라서 귀하의 경우 그렇게 열심히 일하지 마십시오.

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

러닝 git status은 다음과 같은 것을 보여줄 것입니다 :

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    common/file.txt -> include/common/file.txt
#

44
이것은 나를 위해 작동하지 않습니다 (Windows 7, 1.7.6.msysgit.0 사용). Git은 오래된 파일이 삭제되고 새로운 파일이 추가되었다고 생각합니다.
Bart

음, 아마도 git은 일부 외부 유틸리티를 사용하여 Windows에서 파일 동일성이 작동하지 않는지 확인합니까? 이것은 git 구현의 핵심 부분이었습니다.
Andres Jaan Tack

13
@OliverF. 수정 : git mv동일합니다.
안드레스 Jaan 압정

25
"git의 가장 좋은 점 중 하나 " -이 멋진 기능의 단점 중 하나는 이름이 바뀐 파일을 상당 부분 수정할 때도 실패하기 시작하여 새 파일이 삭제되고 추가되는 것을 볼 수 있다는 것입니다 솔직히 말해서 명시적인 이름 바꾸기 지원을 선호합니다.
Erik Kaplun

2
git이 줄 끝을 변환하면 @Bart에 설명 된 문제가 발생합니다. 이것이 작동하려면 다음을 수행해야합니다. git config --global core.autocrlf false
Mariano Dupont

164
 git mv common include

작동해야합니다.

로부터 git mvman 페이지 :

git mv [-f] [-n] [-k] <source> ... <destination directory>

두 번째 형식에서 마지막 인수는 기존 디렉토리 여야합니다. 주어진 소스는이 디렉토리로 이동 합니다.
성공적으로 완료된 후에는 색인이 업데이트되지만 변경 사항은 계속 커밋해야합니다.

이동 하기 전에 " git add"를 수행 하면 안됩니다 .


참고 : " git mv A B/" B는 디렉토리로 존재하지 않는 경우 오류가 발생하지만 그렇지 않습니다.

Git 1.9 / 2.0 (2014 년 1 분기 )에 대한 Matthieu Moy ( )의 커밋 c57f628 을 참조하십시오 .moy

Git은 후행 슬래시를 자르고 명령을 ' git mv file no-such-dir' 와 동일하게 만들어 파일을 만들었습니다 no-such-dir(후행 슬래시는 디렉토리 일 수 있다고 명시 적으로 언급 함).

이 패치는 대상 경로의 슬래시 제거를 건너 뜁니다.
끝에 슬래시가있는 경로는 rename (2)로 전달되며, 해당 메시지와 함께 오류가 발생합니다.

$ git mv file no-such-dir/
fatal: renaming 'file' failed: Not a directory

2
완벽하게 작동했습니다. 사용 git mv하는 것이 훨씬 더 나은 방법처럼 보입니다!
Tomas Petricek

23

명령:

$ git mv oldFolderName newFolderName

일반적으로 잘 작동합니다.

"bad source ..."오류는 일반적으로 마지막 커밋 후에 소스 디렉토리에 일부 이름이 바뀌 었으므로 git mv예상 파일을 찾을 수 없음을 나타냅니다 .

해결책은 적용하기 전에 커밋하는 것 git mv입니다.


15

실행하기 전에 모든 변경 사항을 스테이징 영역에 추가했는지 확인하십시오.

git mv oldFolderName newFoldername

자식은 오류와 함께 실패

fatal: bad source, source=oldFolderName/somepath/somefile.foo, destination=newFolderName/somepath/somefile.foo

추가되지 않은 파일이 있으면 방금 알았습니다.


"추가되지 않은 파일이 있으면 방금 알았습니다." - 감사!
cacoder

3

디렉토리의 모든 파일을 하위 디렉토리로 옮기는 또 다른 방법 (git history를 유지) :

$ for file in $(ls | grep -v 'subDir'); do git mv $file subDir; done;


주의 : 폴더 / 파일 이름에 공백이 있으면 문제가 발생합니다!
dejoma

3

git mv한 폴더의 내용을 기존 폴더로 옮기고 싶었던이 "간단한"스크립트로 끝나는 비슷한 문제가있었습니다 .

pushd common; for f in $(git ls-files); do newdir="../include/$(dirname $f)"; mkdir -p $newdir; git mv $f $newdir/$(basename "$f"); done; popd

설명

  • git ls-files: commongit에 체크인 된 모든 파일 ( 폴더 내)을 찾으십시오.
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;: 폴더 include구조와 동일한 폴더 구조로 폴더 안에 새 폴더를 만듭니다.common
  • git mv $f $newdir/$(basename "$f"): 파일을 새로 만든 폴더로 이동

이 작업을 수행하는 이유는 git이 파일을 기존 폴더로 이동하는 데 문제가있는 것 같고 파일을 존재하지 않는 폴더로 이동하려고하면 실패합니다 (따라서 mkdir -p).

이 방법의 좋은 점은 git에 이미 체크인 된 파일 만진다 는 것입니다 . 단순히 git mv전체 폴더를 이동하는 데 사용 하고 폴더에 준비되지 않은 변경 사항이 포함되어 있으면 git은 수행 할 작업을 알 수 없습니다.

파일을 이동 한 후에 는 저장소정리하여 남아있는 준비되지 않은 변경 사항을 제거 할 수 있습니다. 먼저 건식 실행을 기억하십시오!

git clean -fd -n

주의 : 폴더 / 파일 이름에 공백이 있으면 문제가 발생합니다!
dejoma

2

"Andres Jaan Tack"의 "답변"을 언급 할만한 명성을 얻지 못해 죄송합니다.

나는 내 메시지가 삭제 될 것이라고 생각한다.

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

새 폴더에 프로젝트의 git history가 표시되지 않을 수 있습니다.

나는 노력했다

$ git mv oldFolderName newFolderName

얻었다

fatal: bad source, source=oldFolderName/somepath/__init__.py, dest
ination=ESWProj_Base/ESWProj_DebugControlsMenu/somepath/__init__.py

내가 했어

git rm -r oldFolderName

git add newFolderName

내 프로젝트에 오래된 자식 기록이 표시되지 않습니다. 적어도 내 프로젝트는 손실되지 않습니다. 이제 newFolderName에 프로젝트가 있지만 기록이 없습니다 (

만약 당신이 git hsitory를 잃고 싶지 않다면, "Andres Jaan Tack"의 조언을 사용하여 조심해서 경고하고 싶다.


모든 변경 사항이 추가되었는지 확인하십시오. 추가되지 않은 변경 사항이 있으면 Git이 "잘못된 소스"라고 말하지 않으므로 방금 알았습니다.
Kevin Pluck

0

비슷한 문제가 있었지만 이동하려는 폴더에 추적하지 않는 파일이 있습니다.

내가 파일을 가지고 있다고 가정 해 봅시다

a/file1
a/untracked1
b/file2
b/untracked2

추적 된 파일 만 하위 폴더로 이동하고 싶었습니다. subdir 으므로 목표는 다음과 같습니다.

subdir/a/file1
subdir/a/untracked1
subdir/b/file2
subdir/b/untracked2

내가 한 일은 :

  • 새 폴더를 만들고 이동하려는 모든 파일을 이동했습니다. mkdir tmpdir && mv a b tmpdir
  • 오래된 파일을 체크 아웃 git checkout a b
  • 새로운 디렉토리를 만들고 깨끗한 폴더 (추적되지 않은 파일없이)를 새로운 하위 디렉토리로 옮겼습니다. mkdir subdir && mv a b subdir
  • subdir에서 모든 파일을 추가했습니다 (따라서 Git은 이전에 추적 된 파일 만 추가 할 수 있습니다- git add --update디렉토리 변경 트릭 과 비슷합니다 ) : git add subdir(일반적으로 추적되지 않은 파일도 추가됩니다- .gitignore파일을 만들어야 합니다)
  • git status 이동 된 파일 만 표시
  • 나머지 파일을 tmpdir에서 subdir로 이동했습니다. mv tmpdir/* subdir
  • git status우리가 실행 한 것처럼 보입니다 git mv:)

-1

이 작업을 수행하여 Windows 에서이 문제를 해결했습니다.

  • 오픈 파워 쉘 콘솔
  • dir을 실행
  • Alt 키를 누른 상태에서 파일 / 폴더 이름 열을 드래그 한 다음 복사
  • 메모장에 붙여 넣기 ++
  • 정규 표현식으로 대체 실행 교체 (.*)와 함께git mv ".\\\1" ".\\<New_Folder_Here>\"
  • 모든 텍스트를 notepad ++에서 powershell로 복사
  • 엔터를 치다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.