programing

Git에서 하위 디렉터리를 체크아웃하시겠습니까?

muds 2023. 7. 15. 10:42
반응형

Git에서 하위 디렉터리를 체크아웃하시겠습니까?

Git에 있는 저장소의 하위 디렉터리를 체크아웃할 수 있습니까?

새 WordPress 설치를 설정하고 있다고 상상해 보십시오.플러그인 및 테마 사용자 지정을 위한 두 개의 새 디렉토리를 생성합니다.

  • wordpress/wp-content/plugins/myplugins/
  • wordpress/wp-content/themes/mytheme/

Git를 통해 이러한 디렉터리를 유지 관리하고 싶습니다.Subversion에서, 나는 이것을 성취할 것입니다.trunk/myplugins/그리고.trunk/mytheme/디렉터리 및 하위 디렉터리 체크아웃.Git는 단일 저장소를 사용하여 동일한 작업을 수행할 수 있는 방법이 있습니까?

오랜 SVN 사용자로서 Git에 거의 노출되지 않은 Git 패러다임의 보트를 놓칠 수 있습니다.

편집: 서로 다른 콘텐츠를 저장하는 여러 지점은 이를 처리하는 흥미로운 방법입니다.

이제 Git 1.7에 희박한 체크아웃이 있습니다.

또한 "전체 리포지토리를 먼저 체크아웃하지 않고 스파스 체크아웃을 수행할 수 있습니까?" 질문을 참조하십시오.

Git가 다운로드하는 일부 파일이 작업 트리에 포함되지 않더라도, 드문 체크아웃을 수행하려면 전체 리포지토리를 다운로드해야 합니다.

git clone --filter+git sparse-checkout합니다.

하위 디렉터리 예: 파일만 복제하려면 다음과 같이 .small/다음 테스트 저장소: https://github.com/cirosantilli/test-git-partial-clone-big-small-no-bigtree

git clone -n --depth=1 --filter=tree:0 \
  https://github.com/cirosantilli/test-git-partial-clone-big-small-no-bigtree
cd test-git-partial-clone-big-small-no-bigtree
git sparse-checkout set --no-cone small
git checkout

이 옵션은 원격 프로토콜에 대한 업데이트와 함께 추가되었으며 서버에서 개체가 다운로드되는 것을 방지합니다.

Git 저장소의 하위 디렉터리만 복제하려면 어떻게 해야 합니까?

2021년 1월 git 2.30.0에서 테스트 완료.

그것을 하는 진짜 방법은 없습니다.또한 단일 작업 단위로 두 트리에 동시에 영향을 미치는 변경 사항을 적용하지 않을 경우 두 트리에 대해 단일 저장소를 사용할 이유가 없습니다.이 Subversion 기능을 놓칠 줄 알았는데 저장소를 만드는 것은 관리적인 정신적 오버헤드가 거의 없다는 것을 알게 되었습니다(단순히 저장소가 작업 복사본 바로 옆에 저장되어 있기 때문에).작업 복사본 이외의 장소를 명시적으로 선택하도록 요구하는 것보다) 많은 소형 단일 목적 저장소를 만드는 데 익숙했습니다.

하지만 만약 당신이 고집한다면(또는 정말로 필요하다면), 당신은 Git 저장소를 만들 수 있습니다.mytheme그리고.mypluginsWordPress 설치 내의 디렉토리 및 심볼릭 링크.


MDCore가 작성한 내용:

예를 들어, 의 주제는 플러그인에 대한 수정 번호를 증가시킬 것입니다.

만약 당신이 두 개의 디렉토리를 하나의 저장소에 두기로 결정한다면, 이것은 git와 관련된 문제가 아닙니다. git는 어떤 형태로든 단조롭게 개정 번호를 늘리는 개념을 완전히 없애버리기 때문입니다.

단일 저장소 git에 무엇을 결합할지에 대한 유일한 기준은 단일 단위를 구성하는지 여부입니다. 즉, 사용자의 경우 각 디렉터리의 편집 내용을 개별적으로 살펴보는 것이 의미가 없는 변경 사항이 있는지 여부입니다.두 디렉토리의 파일을 한 번에 편집해야 하는 변경사항이 있고 편집 내용이 함께 속하는 경우, 해당 변경사항은 하나의 리포지토리여야 합니다.만약 그렇지 않다면, 그들을 함께 얼버무리지 마세요.

Git는 정말로 개별 엔터티에 대해 별도의 저장소를 사용하기를 원합니다.

서브모듈

서브모듈은 실제로 디렉토리에 대해 별도의 리포지토리를 보유하고 서브모듈을 사용하여 다른 리포지토리에 함께 가져오기 때문에 두 디렉토리를 하나의 리포지토리에 유지하려는 욕구를 해결하지 못합니다.더 나쁜 것은 WordPress 설치 내부의 디렉토리가 동일한 디렉토리의 직접 하위 디렉토리가 아니며 많은 다른 파일을 포함하는 계층 구조의 일부이기 때문에 통합 저장소에서 디렉토리별 저장소를 하위 모듈로 사용하면 사용 사례/요구를 반영하지 않기 때문에 아무런 이점도 얻을 수 없습니다.

스파스 체크아웃에 대해 제가 좋아하지 않는 한 가지는 몇 개의 디렉토리 깊이가 있는 하위 디렉토리를 체크아웃하려면 디렉토리 구조가 해당 디렉토리로 이어지는 모든 디렉토리를 포함해야 한다는 것입니다.

이 문제를 해결하는 방법은 작업영역이 아닌 곳에 레포를 복제한 다음 작업영역 디렉토리에 저장소의 하위 디렉토리에 대한 심볼릭 링크를 만드는 것입니다.Git 상태와 같은 것이 현재 작업 디렉터리와 관련된 변경 파일을 표시하기 때문에 Git은 매우 잘 작동합니다.

사실, "좁은" 또는 "부분적인" 또는 "희소한" 체크아웃은 현재 Git에 대한 심각한 개발 중입니다.참고로, 당신은 여전히 아래에 전체 저장소가 있을 것입니다..git따라서 나머지 두 게시물은 Git의 현재 상태에 대해 최신 상태이지만 결국에는 희박한 체크아웃을 수행할 수 있을 으로 보입니다. 자세한 정보에 관심이 있는 경우 메일 목록을 확인하십시오. 메일 목록은 빠르게 변경되고 있습니다.

편집한 내용에서 알 수 있듯이 두 개의 개별 분기를 사용하여 두 개의 개별 디렉토리를 저장할 수 있습니다.이렇게 하면 둘 다 동일한 리포지토리에 보관되지만 두 디렉터리 트리에 걸쳐 커밋을 수행할 수 없습니다.하나를 변경하여 다른 하나를 변경해야 하는 경우 두 개의 별도 커밋으로 수행해야 하며 두 디렉토리의 체크아웃 쌍이 동기화되지 않을 수 있습니다.

디렉터리 쌍을 하나의 단위로 취급하려면 'wordpress/wp-content'를 repo의 루트로 사용하고 최상위 수준에서 .gitignore 파일을 사용하여 관심 있는 두 하위 디렉터리를 제외한 모든 항목을 무시할 수 있습니다.이것이 현 시점에서 가장 합리적인 해결책일 것입니다.

2년 전부터 희소성이 있는 체크아웃이 들어온 것으로 알려졌지만, 깃 개발 보고서에는 여전히 그 징후가 없고, 필요한 변화가 그곳에 도달할 것이라는 징후도 없습니다.저는 그들을 믿지 않을 것입니다.

전체 리포지토리는 하위 버전의 수많은 .svn 디렉터리 대신 프로젝트 루트에 있는 단일 .git 폴더에서 처리되므로 리포지토리의 단일 디렉터리를 체크 아웃할 수 없습니다.

단일 저장소에서 플러그인을 작업할 때의 문제는 예를 들어, my테마를 커밋하면 플러그인의 수정 번호가 증가하므로, 버전이 바뀌더라도 별도의 저장소를 사용하는 것이 더 낫다는 것입니다.

하위 프로젝트의 하위 버전 패러다임은 git의 하위 모듈로 어느 정도 변환되는 svn:externals입니다(그러나 svn:externals를 이전에 사용한 적이 있는 경우는 정확하지 않습니다).

여기에 영감이 있습니다.활용하기만 하면 됩니다.shell regex또는git regex.

git checkout commit_id */*.bat  # *.bat in 1-depth subdir exclude current dir, shell regex  
git checkout commit_id '*.bat'  # *.bat in all subdir include current dir, git regex

따옴표를 사용하여 셸 정규식 해석을 피하고 와일드카드를 git에 전달합니다.

첫 번째는 재귀적이지 않고 1-depth 파일만 있습니다.subdir하지만 두 번째는 재귀적인 것입니다.

당신의 상황에 대해서는 다음과 같이 하면 충분할 것 같습니다.

git checkout master */*/wp-content/*/*
git checkout master '*/wp-content/*'

필요에 따라 회선을 해킹합니다.

커밋되지 않은 변경 사항은 특정 파일 또는 디렉토리에만 되돌릴 수 있습니다.

git checkout [some_dir|file.txt]

Git 저장소의 하위 디렉터리만 복제하려면 어떻게 해야 합니까?의 응답을 포함하여 다양한 응답을 살펴보았습니다.

간단한 답이 아니었기 때문에 저는 프로세스를 단순화하는 데 도움이 되는 작은 셸 스크립트를 작성하기로 결정했습니다.https://gist.github.com/hiranp/a26e334369386211709f4846929a6157 을 참조하십시오.

#!/bin/env bash

# This script clones the remote repository using the --filter=blob:none option to avoid downloading any file contents. 
#   It then checks out the specified remote branch and enables sparse-checkout. The sparse-checkout pattern is set to only 
#   include the desired folder, and finally, the latest changes are pulled from the remote branch.

# NOTE: 
# Customize this script by setting the REMOTE_REPO_URL, REMOTE_BRANCH, GIT_FOLDER_PATH, and LOCAL_REPO_PATH variables.

# Set the remote repository URL
REMOTE_REPO_URL="<URL>"

# Set the remote branch name
REMOTE_BRANCH="branch-name"

# Set the path to the folder you want to copy
GIT_FOLDER_PATH="path/to/folder"

# Set the path to the local repository
LOCAL_REPO_PATH="path/to/local/repo"

echo "Cloning the remote repository...to ${LOCAL_REPO_PATH}"
if [ ! -d "${LOCAL_REPO_PATH}" ]; then
    mkdir -p "${LOCAL_REPO_PATH}"
    # Shadow clone the remote repository
    git clone --depth 1 --no-checkout --filter=blob:none "${REMOTE_REPO_URL}" "${LOCAL_REPO_PATH}"
fi

# Change to the repository directory
cd "${LOCAL_REPO_PATH}"

# Checkout the remote branch
git checkout "${REMOTE_BRANCH}"

if [ ! -f ".git/info/sparse-checkout" ]; then
    # Enable sparse-checkout
    git sparse-checkout init

    # Set the sparse-checkout pattern to only include the desired folder
    git sparse-checkout set "${LOCAL_REPO_PATH}"
fi

# Pull the latest changes from the remote branch
git pull origin "${REMOTE_BRANCH}"

언급URL : https://stackoverflow.com/questions/180052/checkout-subdirectories-in-git

반응형