ProgramingTip

폴더 계층 구조에서 모든 git 콘텐츠를 한 수준 위로 이동해야합니까?

bestdevel 2021. 1. 7. 21:28
반응형

폴더 계층 구조에서 모든 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 rmgit이 계속 커밋하고 혼란 스러울 것입니다 (많은 SO 질문 참조 ...). 인덱스는 merges 동안 비슷한 방식으로 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

참조 URL : https://stackoverflow.com/questions/7130850/how-can-i-move-all-git-content-one-level-up-in-the-folder-hierarchy

반응형