폴더 계층 구조에서 모든 git 콘텐츠를 한 수준 위로 이동해야합니까?
구조가 다음과 같은 마이너스 저장소가 있습니다.
+--repo.git
|
+----+bootstrap.py
+----+buildout.cfg
+----+.gitignore
+----+webapp
|
+---------+manage.py
+---------+modules
+---------+templates
+---------+static
+---------+...
+---------+...
webapp
폴더 의 내용을 한 단계 위로 이동하고 싶습니다 . 내 결과 저장소는 다음과 소중합니다.
+--repo.git
|
+----+bootstrap.py
+----+buildout.cfg
+----+.gitignore
+----+manage.py
+----+modules
+----+templates
+----+static
+----+...
+----+...
webapp
디렉토리 의 모든 파일을 한 수준 위로 이동 하고 빈 webapp
디렉토리를 삭제 한 다음 변경 사항을 커밋하여 수행 할 수 있습니까? 이렇게하면 webapp
디렉토리 아래 에있는 파일의 커밋 기록이 보존 이란?
많은 분들에게 매우 간단한 질문이지만 확신하고 싶습니다. 내가 원하는 마지막 것은 git soup입니다.
파일 이동을 시도했지만 git이 실제로 나 이름을 처리하지 않기 때문에 커밋 기록을 잃었습니다. .NET의 일부 옵션을 사용하여 파일에 새 파일로 표시 로그를 볼 수 있습니다 git log
.
내가 읽은 바에 따르면 수행하는 가장 좋은 방법은 git-filter
. 나는 쉘이나 이야기 할 줄 수 있습니다.
방금 실제로는 매우 간단합니다. 이를 수행하는 올바른 방법은-
git mv repo.git/webapp/* repo.git/.
그리고
git rm repo.git/webapp
다음에
git add *
git commit -m "Folders moved out of webapp directory :-)"
Sumeet의 답변의 또 다른 변형- "webapp"위의 저장소 디렉토리에서 다음 명령을 실행합니다.
git mv webapp/* ./ -k
-k- 아직 버전 제어를받지 않은 파일을 포함합니다. 명명 된 다음을 얻습니다.
fatal: not under version control, source=webapp/somefile, destination=somefile
git이 먼저 파일의 해시를 기반으로 변경 사항을 추적 한 다음 해당 위치를 추적 한 솔루션이 작동합니다.
파일 이동의 일부로 파일 내용을 변경하면 작동하지 않습니다.
하단의 경우 시도해보고 작동하지 말 지어 변경 사항을 마스터 저장소에 푸시하기 전에 변경 사항을 되돌릴 수 있습니다. 이것이 내가 정말 화가를 좋아하는 이유 중 하나입니다.
편집하다
이름을 바꾼 후 변경 사항을 보려면 '매개 변수를 --follow'매개 변수를 매다는 점을 잊었습니다. 이 예를 확인하십시오.
먼저 새로운 git repo를 만들었습니다.
94:workspace augusto$ mkdir gittest
94:workspace augusto$ cd gittest/
94:gittest augusto$ git init
Initialized empty Git repository in /Volumes/Data/dev/workspace/gittest/.git/
그런 다음 폴더 / 테스트에 파일을 생성했습니다.
94:gittest augusto$ mkdir folder
94:gittest augusto$ vi folder/test
94:gittest augusto$ git add folder/test
94:gittest augusto$ git commit -am "added file"
[master (root-commit) 7128f82] added file
1 files changed, 1 insertions(+), 0 deletions(-)
create mode 100644 folder/test
그런 다음 파일을 새 폴더 / 테스트 로 이동했습니다.
94:gittest augusto$ mkdir newfolder
94:gittest augusto$ mv folder/test newfolder/
94:gittest augusto$ git add newfolder/test
94:gittest augusto$ git commit -am "moved/renamed file"
[master 4da41f5] moved/renamed file
1 files changed, 0 insertions(+), 0 deletions(-)
rename {folder => newfolder}/test (100%)
그리고 git log --follow newfolder/test
전체 기록을 보여줍니다 (경로와 같은 더 많은 정보를 표시하기 위해 매개 변수 -p를 추가했습니다).
94:gittest augusto$ git log --follow -p newfolder/test
commit 4da41f5868ab12146e11820d9813e5a2ac29a591
Author: Augusto Rodriguez <xxxx@gmail.com>
Date: Sat Aug 20 18:20:37 2011 +0100
moved/renamed file
diff --git a/folder/test b/newfolder/test
similarity index 100%
rename from folder/test
rename to newfolder/test
commit 7128f8232be45fd76616f88d7e164a840e1917d5
Author: Augusto Rodriguez <xxxx@gmail.com>
Date: Sat Aug 20 18:19:58 2011 +0100
added file
diff --git a/folder/test b/folder/test
new file mode 100644
index 0000000..3b2aed8
--- /dev/null
+++ b/folder/test
@@ -0,0 +1 @@
+this is a new file
이게 도움이 되길 계속!
창에서 다음을 수행 할 수 있습니다.
하위 폴더에있는 동안
for /f %f in ('dir /b') do git mv %f ../
결과는 하위 폴더의 모든 개체가 상위 폴더에 있습니다.
참고 : 하위 폴더에 이름이 하위 폴더와 같은 개체가 있으면 일부 오류가 발생할 수 있습니다.
예, 간단히 파일을 이동할 수 있습니다. 그러나 git에게 webapp 폴더의 이전 파일이 사라 졌다고 알려야합니다. 즉, 완료 / 커밋 된 파일의 색인을 업데이트해야합니다.
git add -A .
따라서을 사용 하여 모든 변경 사항 git mv <files>
을 git에 알리거나을 사용하여 git에게 자체적으로 이동하도록 지시 할 수 있습니다. git mv 매뉴얼 페이지를 참조하십시오 .
--최신 정보.
".. git은 이동이나 이름 변경을 처리하지 않는다 .."라고 생각했습니다.-처음에는 혼란 스러웠고 인덱스가 작동하는 방식을 완전히 이해하지 못했습니다. 한편 민속 말의 자식에서만 스냅 샷을 소요하고 이름 변경을 추적하지 않습니다,하지만 당신은 업데이트 할 경우 당신은 '실패'함께 맞고 .gitignore
, 또는 mv
파일 등이 '실패'에 대한 혼란이다 방법 색인 작동합니다.
내 시각화는 인덱스 / 스테이징 영역이 스토리 보드 벽과 같은 장소로, 경로를 포함하여 가장 최근의 '완성 된'파일의 복사본을 배치하고 (를 사용하여 git add
) 커밋 된 복사본이라는 것입니다. 스토리 보드 벽 (예 :)에서 해당 카피를 가져 오지 않으면 git rm
git이 계속 커밋하고 혼란 스러울 것입니다 (많은 SO 질문 참조 ...). 인덱스는 merge
s 동안 비슷한 방식으로 git에서도 사용됩니다.
대상 폴더에서 간단히 다음과 같이 작동하도록 할 수있었습니다.
git mv webapp/* .
Windows 셸 (오류와 함께 실패에서 작동하지 않는 것 Bad source
),하지만 것입니다 당신이 확장 망할 놈의 배쉬 쉘, 사용하는 경우 Windows에서 작동 *
와일드 카드를.
PowerShell을 사용하는 경우 프로젝트 루트에서이 명령을 실행할 수 있으며 여기에 webapp의 콘텐츠가 배치됩니다.
Get-ChildItem .\webapp\ | ForEach-Object { git mv $_.FullName .\ }
예, git은 이전 콘텐츠의 변경 사항을 추적합니다. 파일 내용의 해시를 사용하므로 디렉토리 구조의 위치에 관계없이 동일한 파일이됩니다.
결과적으로 하나의 커밋에서 이동을 수행 한 다음 후속 커밋에서 수정 사항을 수정해야합니다. 이렇게하면 Git이 최대의 효율성으로 리디렉션을 결정할 수 있으며 리포지토리에 저장된 데이터의 양에 영향을주지 않습니다 (어쨌든 변경을 수행 할 것이므로).
Windows에서 Bash를 사용하면 다음이 작동했습니다.
git mv /c/REPO_FOLDER/X_FOLDER/Y_FOLDER/Z_FOLDER/* /c/REPO_FOLDER/X_FOLDER/Y_FOLDER
'ProgramingTip' 카테고리의 다른 글
예외 발생없이 우수한 스택 추적 인쇄 (0) | 2021.01.07 |
---|---|
node.js 소스 파일을 이용하는 방법이 있습니까? (0) | 2021.01.07 |
Windows 8에서 라이브 타일은 어떻게 만들어 집니까? (0) | 2021.01.07 |
Ruby Koans의 test_changing_hashes에있는 개체 질문에 대한 답은 무엇입니까? (0) | 2021.01.07 |
음, std :: unique_ptr의 사용자 지정 (0) | 2021.01.07 |