programing

"git export"(예: "svn export")를 합니까?

firstcheck 2023. 5. 13. 21:20
반응형

"git export"(예: "svn export")를 합니까?

나는 그것 없이 트리의 복사본을 만드는 좋은 "깃 내보내기" 솔루션이 있는지 궁금했습니다..git리포지토리 디렉터리입니다.제가 알고 있는 방법은 적어도 세 가지입니다.

  1. git clone에 다로제니다합거으음▁the를 제거합니다..git리포지토리 디렉터리입니다.
  2. git checkout-index 이 기능을 암시하지만 "원하는 트리를 인덱스에 읽기만 하면 됩니다.어떻게 해야 할지 잘 모르겠어요
  3. git-export 기본적으로 다음 작업을 수행하는 타사 스크립트입니다.git clone임시 위치로 이동한 후에rsync --exclude='.git'최종 목적지까지

이 솔루션들 중 어느 것도 만족스럽지 못하다는 인상을 주지 못했습니다.가 것은운에서 가장 것.svn export둘 다 먼저 대상 디렉터리를 비워 두어야 하기 때문에 옵션 1일 수 있습니다.하지만 제가 색인에 트리를 읽는 것이 무엇을 의미하는지 알아낼 수 있다고 가정하면, 옵션 2는 훨씬 더 좋아 보입니다.

이를 달성하는 가장 간단한 방법은 를 사용하는 것입니다. 정말로 확장된 트리만 필요하다면 이와 같은 작업을 수행할 수 있습니다.

git archive master | tar -x -C /somewhere/else

git에서 무언가를 '내보내야' 하는 대부분의 경우, 저는 압축된 아카이브를 원하기 때문에 이런 작업을 합니다.

git archive master | bzip2 >source-tree.tar.bz2

ZIP 아카이브:

git archive --format zip --output /full/path/to/zipfile.zip master 

git help archive 좀 더 자세히 말하자면, 그것은 매우 유연합니다.


아카이브에 .git 디렉터리가 포함되지 않더라도 .gitignore, .git 특성 등과 같은 다른 숨겨진 git 관련 파일이 포함됩니다.이러한 속성을 아카이브에 저장하지 않으려면 .git 속성 파일의 내보내기 무시 속성을 사용하고 아카이브를 수행하기 전에 이 속성을 커밋해야 합니다.자세히 보기...


참고: 인덱스를 내보내려면 다음 명령을 사용합니다.

git checkout-index -a -f --prefix=/destination/path/

(자세한 내용은 Greg의 답변 참조)

저는 옵션 2가 무엇을 의미하는지 알았습니다.리포지토리에서 다음 작업을 수행할 수 있습니다.

git checkout-index -a -f --prefix=/destination/path/

경로 끝의 슬래시는 중요합니다. 그렇지 않으면 파일이 /destination에 접두사 'path'로 지정됩니다.

일반적인 상황에서 인덱스는 리포지토리의 내용을 포함하므로 "원하는 트리를 인덱스로 읽기" 위해 특별히 수행할 작업은 없습니다.그것은 이미 거기에 있습니다.

-a인덱스의 모든 파일을 체크아웃하려면 플래그가 필요합니다(이 상황에서 이 플래그를 생략하는 것이 무엇을 의미하는지 잘 모르겠습니다. 왜냐하면 이 플래그는 제가 원하는 것을 수행하지 않기 때문입니다.).-f 이 않습니다.

이것은 제가 찾던 일종의 "깃 수출"인 것 같습니다.

git archive원격 리포지토리와도 작동합니다.

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master | tar -xf -

repo 내부의 특정 경로를 내보내려면 git에 마지막 인수만큼 경로를 추가합니다. 예:

git archive --format=tar \
--remote=ssh://remote_server/remote_repository master path1/ path2/ | tar -xv

여기에 이미지 설명 입력

리포지토리가 GitHub에서 호스트되는 경우 특별한 대/소문자 답변입니다.

그냥 사용하기svn export.

가 알기로는 은 Github을 허용하지 않는 .archive --remoteGitHub은 svn과 호환되며 모든 Git Repos가 있습니다.svn액세스 가능하기 때문에 그냥 사용할 수 있습니다.svn exportGitHub URL을 몇 가지 조정하면 보통 그러하듯이 말입니다.

를 들어에는 " " " " " " " " " " " " 를 확인합니다.trunk에서 "URL"을(를)master(또는 프로젝트의 HEAD 분기가 설정된 경우):

svn export https://github.com/username/repo-name/trunk/

단일 파일 또는 특정 경로 또는 폴더를 내보낼 수 있습니다.

svn export https://github.com/username/repo-name/trunk/src/lib/folder

jQuery JavaScript 라이브러리 예제

HEAD다음을 사용하여 분기 또는 마스터 분기를 사용할 수 있습니다.trunk:

svn ls https://github.com/jquery/jquery/trunk

은...HEAD 다음에서 분기에 액세스할 수 있습니다./branches/:

svn ls https://github.com/jquery/jquery/branches/2.1-stable

아래의 모든 태그/tags/동일한 방식으로:

svn ls https://github.com/jquery/jquery/tags/2.1.3

Git 설명서에서:

git-checkout-index를 사용하여 "전체 트리 내보내기"

접두사 기능은 기본적으로 git-checkout-index를 "트리로 내보내기" 함수로 사용하는 것을 사소한 일로 만듭니다.원하는 트리를 인덱스로 읽어 들이고 다음을 수행합니다.

$ git checkout-index --prefix=git-export-dir/ -a

간단한 포장지를 작성했습니다.git-checkout-index다음과 같이 사용할 수 있습니다.

git export ~/the/destination/dir

존재하는 대상디가이있경추합야다를 추가해야 .-f또는--force.

. 를 설치간다의 됩니다. 스크립트를 사용자의 위치에 놓기만 하면 됩니다.PATH실행 가능한지 확인합니다.

다음을 위한 github 저장소git-export

이것은 SVN보다 Git과 관련된 문제가 덜한 것으로 보입니다.Git는 저장소 루트에 .git 폴더만 저장하고 SVN은 모든 하위 디렉터리에 .svn 폴더를 저장합니다.따라서 "svn 내보내기"는 Git 재귀가 필요 없는 반면, 재귀 명령줄 마법을 방지합니다.

의 등가물

svn export . otherpath

기존의 매장 내에서.

git archive branchname | (cd otherpath; tar x)

의 등가물

svn export url otherpath

이라

git archive --remote=url branchname | (cd otherpath; tar x)

파을제않경을우지하가 있는 .gitattributes export-ignore그럼 시도해 보세요git checkout

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q

-f
인덱스에서 경로를 체크아웃할 때 병합되지 않은 항목에 대해 실패하지 마십시오. 대신 병합되지 않은 항목은 무시됩니다.

그리고.

-q
설명은 피하세요.

또한 SHA1(Git의 SHA1은 SVN의 리비전 번호와 동일)을 추가하는 것만으로도 SVN과 같은 특정 커밋 리비전에서 모든 지점 또는 태그를 얻을 수 있습니다.

mkdir /path/to/checkout/
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout 2ef2e1f2de5f3d4f5e87df7d8 -f -q -- ./

/path/to/checkout/한 이름의 . Git는 파일을 삭제하지 않지만 경고 없이 동일한 이름의 파일을 덮어씁니다.

이 잘리는 피하거나 , 또는 SHA1로 위해 할 때 .-- ./

대시 블더시대.--대시 이후의 모든 것이 경로 또는 파일임을 git에 알리며, 이 경우에도 마찬가지입니다.git checkout하지 않는HEAD

예:

와 libs ▁just▁and▁the▁the▁this만 가져옵니다.readme.txt 그 입니다.

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt

이렇게 하면 생성(덮어쓰기)가 생성됩니다.my_file_2_behind_HEAD.txt 에 두 HEAD^2

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout HEAD^2 -f -q -- ./my_file_2_behind_HEAD.txt

다른 분기의 내보내기를 가져오려면 다음과 같이 하십시오.

git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout myotherbranch -f -q -- ./

:./입니다.

저는 git-submodules를 광범위하게 사용합니다.이것은 나에게 효과가 있습니다.

rsync -a ./FROM/ ./TO --exclude='.*'

저는 깃 저장소를 내보낼 방법을 찾을 때 이 페이지를 자주 방문했습니다.이 질문에 대한 나의 대답은 svn이 중앙 저장소 접근 방식을 따르기 때문에 git과 비교하여 svn 내보내기가 설계상 가지고 있는 세 가지 속성을 고려합니다.

  • 일부 리비전을 내보내지 않아 원격 리포지토리 위치로의 트래픽을 최소화합니다.

  • 내보내기 디렉토리에 메타 정보가 포함되어 있지 않습니다.

  • svn을 사용하여 특정 분기를 내보내는 작업은 적절한 경로를 지정하여 수행됩니다.

      git clone --depth 1 --branch main git://git.somewhere destination_path
      rm -rf destination_path/.git
    

를 들어 인 분기를 이 유용합니다.--branch stable또는--branch release/0.9.

이렇게 하면 .dot 파일을 제외한 모든 내용이 복사됩니다..git 항목 없이 git 복제 프로젝트를 내 웹 앱의 git repo로 내보내는 데 사용합니다.

cp -R . /path-to-git-repo /path/to/destination/

평범하고 오래된 배시는 정말 잘 작동합니다 :)

복제하기만 하면 .git 폴더를 삭제할 수 있습니다.

git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git

사용자의 GitHub 사경우,git archive --remote내보내기 URL이 일시적이므로 메서드가 직접 작동하지 않습니다.GitHub에 URL을 요청한 다음 해당 URL을 다운로드해야 합니다.curl이를 쉽게 해줍니다.

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | tar xzf -

로컬 디렉터리에 내보낸 코드가 표시됩니다.예:

$ curl -L https://api.github.com/repos/jpic/bashworks/tarball | tar xzf -
$ ls jpic-bashworks-34f4441/
break  conf  docs  hack  LICENSE  mlog  module  mpd  mtests  os  README.rst  remote  todo  vcs  vps  wepcrack


코드를 github의 임의 디렉터리가 아닌 특정 기존 디렉터리에 넣으려면:

curl -L https://api.github.com/repos/VENDOR/PROJECT/tarball | \
tar xzC /path/you/want --strip 1

, 이것은 보관에 깃을 포함하지 않고 코드를 보관할 수 있는 깨끗하고 깔끔한 명령이며 깃 커밋 기록에 대해 걱정하지 않고 돌아다니기에 좋습니다.

git archive --format zip --output /full/path/to/zipfile.zip master 

제가 지적하고 싶은 것은 당신이 이 사건에서

  1. 리포지토리의 하위 폴더 내보내기(SVN 내보내기 기능을 사용하는 방법)
  2. 해당 폴더에서 배포 대상으로 모든 항목을 복사해도 됩니다.
  3. 전체 저장소의 복사본을 이미 가지고 있기 때문입니다.

그럼 그냥 사용하시면 됩니다.cp foo [destination]된 술한것대에 git-archive master foo | -x -C [destination].

원격 저장소는 임의의 커밋을 zip 파일로 보관할 수 있습니다.

git archive --format=zip --output=archive.zip --remote=USERNAME@HOSTNAME:PROJECTNAME.git HASHOFGITCOMMIT

서브모듈에서 작동하는 것을 원한다면 시도해 볼 가치가 있습니다.

참고:

  • MASTER_DIR = 서브모듈이 체크아웃된 체크아웃도 마찬가지입니다.
  • DEST_DIR = 내보내기가 종료될 위치
  • 만약 당신이 rsync를 가지고 있다면, 저는 당신이 더 적은 두통으로 같은 일을 할 수 있을 것이라고 생각합니다.

가정:

  • MASTER_DIR의 상위 디렉터리(즉, MASTER_DIR cd에서)에서 이 디렉터리를 실행해야 합니다.)
  • DEST_DIR이 생성된 것으로 간주됩니다.원하는 경우 DEST_DIR 생성을 포함하도록 수정하기가 매우 쉽습니다.

cd MASTER_DIR & & & tar -zcvf ../DEST_DIR/export.tar.gz --cd ='.git*' . & & cd ../DEST_DIR/ & tar xvfz export.tar.gz & rm export.tar.gz

실제로 Makefile(또는 다른 빌드 시스템)에 배포 가능한 코드 아카이브(.tar.bz2, .zip, .jar 등)를 내보내는 분산 대상을 두는 것이 좋습니다.만약 당신이 GNU 자동 도구나 펄의 MakeMaker 시스템을 사용하고 있다면, 나는 이것이 자동으로 당신을 위해 존재한다고 생각합니다.그렇지 않다면 추가하는 것을 강력히 추천합니다.

ETA(2012-09-06):와, 가혹한 반대표.저는 여전히 소스 코드 제어 도구보다는 빌드 도구로 배포판을 구축하는 것이 좋다고 생각합니다.저는 빌드 도구로 인공물을 만드는 것을 믿습니다.현재 제가 하는 일에서, 저희의 주력 제품은 개미 타겟으로 제작되었습니다.우리는 소스 코드 제어 시스템을 전환하는 중에 있으며, 이 개미 대상이 있다는 것은 마이그레이션의 번거로움이 한 번 줄어든다는 것을 의미합니다.

질문을 이해하기로는 로컬 저장소(여기 있는 많은 응답자가 하는 것처럼)에서 상태를 추출하는 것보다 서버에서 특정 상태만 다운로드하고 기록 없이 다른 분기의 데이터 없이 다운로드하는 것이 더 중요합니다.

이 작업은 다음과 같이 수행할 수 있습니다.

git clone -b someBranch --depth 1 --single-branch git://somewhere.com/repo.git \
&& rm -rf repo/.git/
  • --single-branchGit 1.7.10(2012년 4월)부터 사용할 수 있습니다.
  • --depth보고된 바에 따르면 (?)가 결함이 있다고 하지만 수출의 경우 언급된 문제는 문제가 되지 않습니다.

git-export의 Bash-구현.

.empty 파일 생성 및 제거 프로세스를 'git-archive' 구현에서 재사용하기 위해 자체 기능으로 분할했습니다(나중에 게시).

또한 대상 내보내기 폴더에서 원하지 않는 파일을 제거하기 위해 프로세스에 '.git 특성' 파일을 추가했습니다.'git-export' 기능을 보다 효율적으로 만드는 동시에 프로세스에 대한 자세한 설명을 포함했습니다.

EMBLE_FILE=."empty";

function create_empty () {
## Processing path (target-dir):
    TRG_PATH="${1}";
## Component(s):
    EXCLUDE_DIR=".git";
echo -en "\nAdding '${EMPTY_FILE}' files to empty folder(s): ...";
    find ${TRG_PATH} -not -path "*/${EXCLUDE_DIR}/*" -type d -empty -exec touch {}/${EMPTY_FILE} \;
#echo "done.";
## Purging SRC/TRG_DIRs variable(s):
    unset TRG_PATH EMPTY_FILE EXCLUDE_DIR;
    return 0;
  }

declare -a GIT_EXCLUDE;
function load_exclude () {
    SRC_PATH="${1}";
    ITEMS=0; while read LINE; do
#      echo -e "Line [${ITEMS}]: '${LINE%%\ *}'";
      GIT_EXCLUDE[((ITEMS++))]=${LINE%%\ *};
    done < ${SRC_PATH}/.gitattributes;
    GIT_EXCLUDE[${ITEMS}]="${EMPTY_FILE}";
## Purging variable(s):
    unset SRC_PATH ITEMS;
    return 0;
  }

function purge_empty () {
## Processing path (Source/Target-dir):
    SRC_PATH="${1}";
    TRG_PATH="${2}";
echo -e "\nPurging Git-Specific component(s): ... ";
    find ${SRC_PATH} -type f -name ${EMPTY_FILE} -exec /bin/rm '{}' \;
    for xRULE in ${GIT_EXCLUDE[@]}; do
echo -en "    '${TRG_PATH}/{${xRULE}}' files ... ";
      find ${TRG_PATH} -type f -name "${xRULE}" -exec /bin/rm -rf '{}' \;
echo "done.'";
    done;
echo -e "done.\n"
## Purging SRC/TRG_PATHs variable(s):
    unset SRC_PATH; unset TRG_PATH;
    return 0;
  }

function git-export () {
    TRG_DIR="${1}"; SRC_DIR="${2}";
    if [ -z "${SRC_DIR}" ]; then SRC_DIR="${PWD}"; fi
    load_exclude "${SRC_DIR}";
## Dynamically added '.empty' files to the Git-Structure:
    create_empty "${SRC_DIR}";
    GIT_COMMIT="Including '${EMPTY_FILE}' files into Git-Index container."; #echo -e "\n${GIT_COMMIT}";
    git add .; git commit --quiet --all --verbose --message "${GIT_COMMIT}";
    if [ "${?}" -eq 0 ]; then echo " done."; fi
    /bin/rm -rf ${TRG_DIR} && mkdir -p "${TRG_DIR}";
echo -en "\nChecking-Out Index component(s): ... ";
    git checkout-index --prefix=${TRG_DIR}/ -q -f -a
## Reset: --mixed = reset HEAD and index:
    if [ "${?}" -eq 0 ]; then
echo "done."; echo -en "Resetting HEAD and Index: ... ";
        git reset --soft HEAD^;
        if [ "${?}" -eq 0 ]; then
echo "done.";
## Purging Git-specific components and '.empty' files from Target-Dir:
            purge_empty "${SRC_DIR}" "${TRG_DIR}"
          else echo "failed.";
        fi
## Archiving exported-content:
echo -en "Archiving Checked-Out component(s): ... ";
        if [ -f "${TRG_DIR}.tgz" ]; then /bin/rm ${TRG_DIR}.tgz; fi
        cd ${TRG_DIR} && tar -czf ${TRG_DIR}.tgz ./; cd ${SRC_DIR}
echo "done.";
## Listing *.tgz file attributes:
## Warning: Un-TAR this file to a specific directory:
        ls -al ${TRG_DIR}.tgz
      else echo "failed.";
    fi
## Purgin all references to Un-Staged File(s):
   git reset HEAD;
## Purging SRC/TRG_DIRs variable(s):
    unset SRC_DIR; unset TRG_DIR;
    echo "";
    return 0;
  }

출력:

git-export /tmp/rel-1.0.0

빈 폴더에 '.empty' 파일을 추가하는 중: ... 완료되었습니다.

인덱스 구성 요소 체크아웃 중: ... 완료되었습니다.

HEAD 및 인덱스 재설정 중: ... 완료.

Git 관련 구성 요소 정리 중: ...

'/tmp/rel-1.0.0/{.buildpath}'파일... 완료되었습니다.'

'/tmp/rel-1.0.0/{.project}' 파일... 완료되었습니다.'

'/tmp/rel-1.0.0/{.gitignore}' 파일... 완료되었습니다.'

'/tmp/rel-1.0.0/{.git}' 파일... 완료되었습니다.'

'/tmp/rel-1.0.0/{.gitattributes}' 파일... 완료되었습니다.'

'/tmp/rel-1.0.0/{*mno}' 파일... 완료되었습니다.'

'/tmp/rel-1.0.0/{*~}' 파일... 완료되었습니다.'

'/tmp/rel-1.0.0/{.파일... 완료됨.'

'/tmp/rel-1.0.0/{*.swp}' 파일... 완료되었습니다.'

'/tmp/rel-1.0.0/{*.swo}' 파일... 완료되었습니다.'

'/tmp/rel-1.0.0/{.DS_Store}'파일... 완료되었습니다.'

'/tmp/rel-1.0.0/{.settings}'파일... 완료되었습니다.'

'/tmp/rel-1.0.0/{.empty}' 파일... 완료되었습니다.'

다 했어요.

아카이브 체크아웃된 구성 요소: ... 완료되었습니다.

-rw-r--r-- 관리 휠 25445901 1 Nov 12:57 /tmp/rel-1.0.tgz

이제 'git archive' 기능을 'create_empty' 기능과 다른 기능을 사용하는 단일 프로세스에 통합했습니다.

function git-archive () {
    PREFIX="${1}"; ## sudo mkdir -p ${PREFIX}
    REPO_PATH="`echo "${2}"|awk -F: '{print $1}'`";
    RELEASE="`echo "${2}"|awk -F: '{print $2}'`";
    USER_PATH="${PWD}";
echo "$PREFIX $REPO_PATH $RELEASE $USER_PATH";
## Dynamically added '.empty' files to the Git-Structure:
    cd "${REPO_PATH}"; populate_empty .; echo -en "\n";
#    git archive --prefix=git-1.4.0/ -o git-1.4.0.tar.gz v1.4.0
# e.g.: git-archive /var/www/htdocs /repos/domain.name/website:rel-1.0.0 --explode
    OUTPUT_FILE="${USER_PATH}/${RELEASE}.tar.gz";
    git archive --verbose --prefix=${PREFIX}/ -o ${OUTPUT_FILE} ${RELEASE}
    cd "${USER_PATH}";
    if [[ "${3}" =~ [--explode] ]]; then
      if [ -d "./${RELEASE}" ]; then /bin/rm -rf "./${RELEASE}"; fi
      mkdir -p ./${RELEASE}; tar -xzf "${OUTPUT_FILE}" -C ./${RELEASE}
    fi
## Purging SRC/TRG_DIRs variable(s):
    unset PREFIX REPO_PATH RELEASE USER_PATH OUTPUT_FILE;
    return 0;
  }

접두사(예: 디렉토리 이름)를 추가하는 동안 zip 아카이브로 내보내기:

git archive master --prefix=directoryWithinZip/  --format=zip -o out.zip

이렇게 하면 커밋 범위(C - G)의 파일이 tar 파일로 복사됩니다.참고: 이렇게 하면 파일만 커밋됩니다.전체 리포지토리가 아닙니다.여기에서 약간 수정됨

커밋 기록 예제

A --> B --> C --> D --> E --> F --> G --> H --> I

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT C~..G | xargs tar -rf myTarFile.tar

git-diff-tree 수동 페이지

-r --> 하위 항목으로 반복됩니다.

--no-commit-id --> git diff-tree는 적용 가능한 경우 커밋 ID가 있는 줄을 출력합니다.이 플래그는 커밋 ID 출력을 억제했습니다.

--name-only --> 변경된 파일의 이름만 표시합니다.

--diff-filter=ACMRT --> 이 파일만 선택합니다.전체 파일 목록은 여기를 참조하십시오.

C..G --> 이 커밋 범위에 있는 파일

C~ --> C위원회의 파일을 포함합니다.C 커밋 이후의 파일뿐만 아니라,

xargs star -rf myTarFile --> tar로 출력

지금까지 본 것 중 가장 쉬운 방법은 다음과 같습니다(창에서도 작동).git bundle:

git bundle create /some/bundle/path.bundle --all

자세한 내용은 다음 답변을 참조하십시오.어떻게 하면 USB 드라이브를 통해 Windows 기계에서 Linux 기계로 Git 저장소를 복사할 수 있습니까?

배포 스크립트에 필요했지만 위에서 언급한 방법을 사용할 수 없었습니다.대신 다른 솔루션을 찾았습니다.

#!/bin/sh
[ $# -eq 2 ] || echo "USAGE $0 REPOSITORY DESTINATION" && exit 1
REPOSITORY=$1
DESTINATION=$2
TMPNAME="/tmp/$(basename $REPOSITORY).$$"
git clone $REPOSITORY $TMPNAME
rm -rf $TMPNAME/.git
mkdir -p $DESTINATION
cp -r $TMPNAME/* $DESTINATION
rm -rf $TMPNAME

쉬운 방법으로 이 기능은 .bash_profile에 대한 함수로, 현재 위치의 아카이브 압축을 직접 풀며, 먼저 평소 [url:path]를 구성합니다.참고: 이 기능을 사용하면 원격 repo에서 직접 복제 작업을 수행할 수 없습니다.

gitss() {
    URL=[url:path]

    TMPFILE="`/bin/tempfile`"
    if [ "$1" = "" ]; then
        echo -e "Use: gitss repo [tree/commit]\n"
        return
    fi
    if [ "$2" = "" ]; then
        TREEISH="HEAD"
    else
        TREEISH="$2"
    fi
    echo "Getting $1/$TREEISH..."
    git archive --format=zip --remote=$URL/$1 $TREEISH > $TMPFILE && unzip $TMPFILE && echo -e "\nDone\n"
    rm $TMPFILE
}

.gitconfig의 별칭, 동일한 구성이 필요합니다(TARE CARE가 .git projects 내부에서 명령을 실행하면 여기에서 말한 대로 항상 기본 dir로 이동합니다. 이것이 해결될 때까지 저는 개인적으로 이 기능을 선호합니다.

ss = !env GIT_TMPFILE="`/bin/tempfile`" sh -c 'git archive --format=zip --remote=[url:path]/$1 $2 \ > $GIT_TMPFILE && unzip $GIT_TMPFILE && rm $GIT_TMPFILE' -

내보내기를 생성할 컴퓨터에 리포지토리의 로컬 복사본이 있으면 작동하는 다른 솔루션이 있습니다.이 경우 이 리포지토리 디렉토리로 이동하고 다음 명령을 입력합니다.

GIT_WORK_TREE=outputdirectory git checkout -f

이 기능은 깃 저장소를 사용하여 웹 사이트를 관리하는 경우 특히 유용하며 다음에서 새 버전을 체크아웃하려는 경우에 유용합니다./var/www/ 경우 이 를 이경다 합니다..git/hooks/post-receivescript)hooks/post-receive 상황에서더 한 맨 합니다.

@Aredridel의 게시물이 가장 가까웠다고 생각하지만, 조금 더 있습니다 - 그래서 저는 여기에 이것을 추가할 것입니다; 중요한 것은,svn보고서의 하위 폴더에 있는 경우 다음 작업을 수행합니다.

/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir

그리고나서svn리비전 제어 하에 있는 모든 파일을 내보냅니다(새로 추가되었거나 수정됨 상태일 수 있음). 그리고 해당 디렉터리에 다른 "정크"가 있는 경우(나는 계산하지 않음)..svn여기에 하위 폴더가 있지만 다음과 같은 항목이 표시됩니다..o파일)은 내보내지 않고 SVN repo에 등록된 파일만 내보냅니다.한 가지 좋은 점은 이 내보내기에 아직 커밋되지 않은 로컬 변경 사항이 있는 파일도 포함된다는 것입니다. 또 다른 좋은 점은 내보낸 파일의 타임스탬프가 원래 파일과 같다는 것입니다.또는, 로서svn help export배치:

  1. PATH1에서 지정한 작업 복사본에서 정리 디렉터리 트리를 내보냅니다. 수정 버전 REV에서 PATH2로 지정하지 않은 경우 해당 트리를 PATH2로 내보냅니다. ...REV를 지정하지 않으면 모든 로컬 변경사항이 보존됩니다.버전 제어 하에 있지 않은 파일은 복사되지 않습니다.

것은git합니다(" " " " ", " " "의 하위 폴더에 있습니다." (" "는 " " " "라는 뜻입니다."라는 뜻입니다."라는 뜻입니다.git선택한 보고서):

/media/disk/git_svn/subdir$ ls -la .

그리고:

/media/disk/git_svn/subdir$ git archive --format=tar --prefix=junk/ HEAD | (tar -t -v --full-time -f -)

그리고 나는, 어쨌든, 나는, 주목한다, 주목합니다.git archive아카이브된 파일의 모든 타임스탬프가 동일합니다! git help archive다음과 같이 말합니다.

git 아카이브는 트리 ID가 지정된 경우와 커밋 ID 또는 태그 ID가 지정된 경우가 다르게 작동합니다.첫 번째 경우 현재 시간이 보관에 있는 각 파일의 수정 시간으로 사용됩니다.후자의 경우 참조된 커밋 개체에 기록된 커밋 시간이 대신 사용됩니다.

그러나 두 경우 모두 "각 파일의 수정 시간"을 설정하므로 해당 파일의 실제 타임스탬프는 보존되지 않습니다!

는 따서타프도보존위기같다합니이다음과해하라탬임스▁a▁is▁so합다니가 있습니다.bash스크립트는 다소 복잡하지만 실제로는 "단일 라이너"이므로 아래에 여러 줄로 게시됩니다.

/media/disk/git_svn/subdir$ git archive --format=tar master | (tar tf -) | (\
  DEST="/media/diskC/tmp/subdirB"; \
  CWD="$PWD"; \
  while read line; do \
    DN=$(dirname "$line"); BN=$(basename "$line"); \
    SRD="$CWD"; TGD="$DEST"; \
    if [ "$DN" != "." ]; then \
      SRD="$SRD/$DN" ; TGD="$TGD/$DN" ; \
      if [ ! -d "$TGD" ] ; then \
        CMD="mkdir \"$TGD\"; touch -r \"$SRD\" \"$TGD\""; \
        echo "$CMD"; \
        eval "$CMD"; \
      fi; \
    fi; \
    CMD="cp -a \"$SRD/$BN\" \"$TGD/\""; \
    echo "$CMD"; \
    eval "$CMD"; \
    done \
)

" 위, "current" 디렉토리에서 내용을 으로 가정합니다./media/disk/git_svn/subdir - 은 다소 위치에 , . - 그고내보대다있위지만불치에, 해당대은상상편한.DEST환경 변수입니다.는 이스트사다생합니다야를 해야 합니다.DEST수동으로 디렉터리를 지정한 후 위 스크립트를 실행하기 전에.

스크립트를 실행한 후 다음을 비교할 수 있어야 합니다.

ls -la /media/disk/git_svn/subdir
ls -la /media/diskC/tmp/subdirB   # DEST

동일한 타임스탬프를 확인할 수 있습니다(버전 제어 중인 파일의 경우).

이게 누군가에게 도움이 되길 바랍니다.
건배!

서브모듈도 필요한 경우 다음과 같이 하십시오. https://github.com/meitar/git-archive-all.sh/wiki

.tvrc 파일에 다음과 같은 유틸리티 기능이 있습니다. git 저장소에 현재 분기의 아카이브를 만듭니다.

function garchive()
{
  if [[ "x$1" == "x-h" || "x$1" == "x" ]]; then
    cat <<EOF
Usage: garchive <archive-name>
create zip archive of the current branch into <archive-name>
EOF
  else
    local oname=$1
    set -x
    local bname=$(git branch | grep -F "*" | sed -e 's#^*##')
    git archive --format zip --output ${oname} ${bname}
    set +x
  fi
}

언급URL : https://stackoverflow.com/questions/160608/do-a-git-export-like-svn-export

반응형