programing

폴더에서 하위 모듈 리포지토리를 만들고 깃 커밋 기록을 유지합니다.

newstyles 2023. 10. 11. 20:34

폴더에서 하위 모듈 리포지토리를 만들고 깃 커밋 기록을 유지합니다.

나는 특정한 방식으로 다른 웹 애플리케이션을 탐색하는 웹 애플리케이션을 가지고 있습니다.웹가 몇 되어 있습니다.demos 이제 폴더와 데모 중 하나에 자체 저장소가 있어야 합니다.이 데모 애플리케이션을 위해 별도의 저장소를 만들고 커밋 이력을 잃지 않고 메인 저장소에서 서브패키지 서브모듈로 만들고 싶습니다.

저장소 폴더의 파일에서 커밋 기록을 유지하고 저장소를 생성하여 대신 하위 모듈로 사용할 수 있습니까?

상세 솔루션

npm을 사용하는 git 서브모듈에 대한 빠른 대안은 이 답변(마지막 단락)의 끝에 있는 메모를 참조하십시오;)

다음 답변에서는 저장소에서 폴더를 추출하고 여기서 git 저장소를 만든 다음 폴더 대신 하위 모듈로 포함하는 방법을 알게 됩니다.

Git Repository에서 다른 Git Repository로 파일 이동, 기록 보존이라는 Gerg Bayer의 기사에서 영감을 얻었습니다.

처음에는 다음과 같은 것이 있습니다.

<git repository A>
    someFolders
    someFiles
    someLib <-- we want this to be a new repo and a git submodule!
        some files

아래 단계에서 이 내용을 참조하도록 하겠습니다.someLib~하듯이<directory 1>.

마지막에, 우리는 다음과 같은 것을 가질 것입니다.

<git repository A>
    someFolders
    someFiles
    @submodule --> <git repository B>

<git repository B>
    someFolders
    someFiles

다른 리포지토리의 폴더에서 새 깃 리포지토리 만들기

1단계

분할할 저장소의 새 복사본을 가져옵니다.

git clone <git repository A url>
cd <git repository A directory>

2단계

현재 폴더가 새 리포지토리가 되므로 현재 원격을 제거합니다.

git remote rm origin

3단계

원하는 폴더의 기록을 추출하여 커밋합니다.

git filter-branch --subdirectory-filter <directory 1> -- --all

git .directory 1관련된 모든 커밋 이력을 가진 당신의 레포의 뿌리에.

4단계

온라인 저장소를 만들고 새 저장소를 밀어 보십시오!

git remote add origin <git repository B url>
git push

를 해야 할 .upstream의 첫 을 위한

git push --set-upstream origin master

<git repository A>항,조)

() 의 (파일)를.<git repository B><git repository A>이 폴더에 대한 기록은 단 한 번뿐입니다.

이것은 github에서 민감한 데이터를 제거하는 것을 기반으로 합니다.

새 폴더로 이동하고

git clone <git repository A url>
cd <git repository A directory>
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch <directory 1> -r' --prune-empty --tag-name-filter cat -- --all

<directory 1>제거할 폴더를 선택합니다.-r지정된 디렉터리 :) 내부에서 재귀적으로 수행합니다. 다음 단계로 합니다.origin/master와 함께--force

git push origin master --force

Boss Stage (아래 참고 참조)

하위 모듈 만들기<git repository B>안으로<git repository A>

git submodule add <git repository B url>
git submodule update
git commit

것이 하고 push

git push origin master

메모

이 모든 것을 한 후에, 저는 저의 경우 npm을 사용하여 저 자신의 의존성을 관리하는 것이 더 적합하다는 것을 깨달았습니다.깃 URL과 버전을 지정할 수 있습니다. 패키지를 참조하십시오.json git urls를 종속성으로 사용합니다.

이런 식으로 하면 요구 사항으로 사용할 저장소는 npm 모듈이어야 하므로 다음을 포함해야 합니다.package.json파일을 입력하지 않으면 다음 오류가 발생합니다.Error: ENOENT, open 'tmp.tgz-unpack/package.json'.

tldr (대체 솔루션)

npm을 사용하고 git URL로 의존 관계를 관리하는 것이 더 쉽다는 것을 알 수 있습니다.

  • 폴더를 새 리포지토리로 이동
  • 달려.npm init양 저장소 안에서
  • 달려.npm install --save git://github.com/user/project.git#commit-ish종속성을 설치할 위치

@GabLeRoux의 솔루션은 분기 및 관련 커밋을 스퀴즈합니다.

모든 추가 분기 및 커밋을 복제하고 유지하는 간단한 방법:

1 - 깃 별칭이 있는지 확인합니다.

git config --global alias.clone-branches '! git branch -a | sed -n "/\/HEAD /d; /\/master$/d; /remotes/p;" | xargs -L1 git checkout -t'

2 - 리모콘 복제, 모든 분기 풀링, 리모콘 변경, 디렉토리 필터링, 푸시

git clone git@github.com:user/existing-repo.git new-repo
cd new-repo
git clone-branches
git remote rm origin
git remote add origin git@github.com:user/new-repo.git
git remote -v
git filter-branch --subdirectory-filter my_directory/ -- --all
git push --all
git push --tags

GabLeRoux의 솔루션은 사용하지 않는 한 효과가 좋습니다.git lfs분리할 디렉토리 아래에 대용량 파일이 있습니다.그 경우 3단계 이후에는 모든 큰 파일이 실제 파일이 아닌 포인터 파일로 남게 됩니다.제 생각에는 아마도 그 이유가.gitattributes파일이 필터 분기 프로세스에서 제거됩니다.

이 사실을 알게 된 저는 다음과 같은 해결책이 제게 도움이 된다는 것을 알게 되었습니다.

cp .gitattributes .git/info/attributes

복사중.gitattributes대용량 파일을 추적하는 데 사용되는 gitlfs..git/디렉터리를 선택하면 삭제되지 않습니다.

필터 분기가 완료되면 다시 돌려놓는 것을 잊지 마십시오..gitattributes새 저장소에 gitlfs를 여전히 사용하려면 다음을 수행합니다.

mv .git/info/attributes .gitattributes
git add .gitattributes
git commit -m 'added back .gitattributes'

언급URL : https://stackoverflow.com/questions/17413493/create-a-submodule-repository-from-a-folder-and-keep-its-git-commit-history