common
소스 파일과 폴더가 많은 폴더 를 만들었습니다 .
이제 common
폴더를 폴더로 옮기고 include
싶습니다.include/common
나는 이것을 시도했다 :
-
git add include
-
git mv common/ include/
하지만이 오류로 실패합니다
치명적 : 잘못된 소스, source = myrepo / common, destination = myrepo / include
-
시도
git mv common/ include/common
했지만 같은 오류가 발생합니다.
이것을 달성하는 방법에 대한 아이디어가 있습니까?
답변
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
#
답변
git mv common include
작동해야합니다.
로부터 git mv
man 페이지 :
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
답변
명령:
$ git mv oldFolderName newFolderName
일반적으로 잘 작동합니다.
“bad source …”오류는 일반적으로 마지막 커밋 후에 소스 디렉토리에 일부 이름이 바뀌 었으므로 git mv
예상 파일을 찾을 수 없음을 나타냅니다 .
해결책은 적용하기 전에 커밋하는 것 git mv
입니다.
답변
실행하기 전에 모든 변경 사항을 스테이징 영역에 추가했는지 확인하십시오.
git mv oldFolderName newFoldername
자식은 오류와 함께 실패
fatal: bad source, source=oldFolderName/somepath/somefile.foo, destination=newFolderName/somepath/somefile.foo
추가되지 않은 파일이 있으면 방금 알았습니다.
답변
디렉토리의 모든 파일을 하위 디렉토리로 옮기는 또 다른 방법 (git history를 유지) :
$ for file in $(ls | grep -v 'subDir'); do git mv $file subDir; done;
답변
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
:common
git에 체크인 된 모든 파일 ( 폴더 내)을 찾으십시오.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
답변
“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”의 조언을 사용하여 조심해서 경고하고 싶다.