질문자 :Greg Hewgill
.git
저장소 디렉토리 없이 트리 사본을 생성하는 좋은 "git export" 솔루션이 있는지 궁금합니다. 제가 아는 방법은 적어도 세 가지가 있습니다.
-
git clone
.git
저장소 디렉토리를 제거합니다. -
git checkout-index
는 이 기능을 암시하지만 "원하는 트리를 인덱스로 읽기만 하면 됩니다..."로 시작하는데 어떻게 해야 할지 잘 모르겠습니다. -
git-export
는 기본적으로 임시 위치로 git clone
를 수행한 다음 최종 대상으로 rsync --exclude='.git'
을 수행하는 타사 스크립트입니다.
이러한 솔루션 중 어느 것도 실제로 만족스럽지 않습니다. svn export
가장 가까운 것은 옵션 1일 수 있습니다. 둘 다 먼저 대상 디렉토리가 비어 있어야 하기 때문입니다. 그러나 트리를 인덱스로 읽는다는 것이 무엇을 의미하는지 이해할 수 있다고 가정하면 옵션 2가 훨씬 더 나은 것 같습니다.
아마도 이것을 달성하는 가장 간단한 방법은 git archive
입니다. 확장된 트리만 필요한 경우 다음과 같이 할 수 있습니다.
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, .gitattributes 등과 같은 다른 숨겨진 git 관련 파일이 포함된다는 점에 유의하십시오. 아카이브에 파일을 포함하지 않으려면 다음을 확인하십시오. .gitattributes 파일에서 export-ignore 속성을 사용하고 아카이브를 수행하기 전에 이것을 커밋하십시오. 더 읽기...
참고: 인덱스 내보내기에 관심이 있는 경우 명령은 다음과 같습니다.
git checkout-index -a -f --prefix=/destination/path/
(자세한 내용은 Greg의 답변 을 참조하십시오.)
CB Bailey옵션 2가 의미하는 바를 알아냈습니다. 저장소에서 다음을 수행할 수 있습니다.
git checkout-index -a -f --prefix=/destination/path/
경로 끝에 있는 슬래시는 중요합니다. 그렇지 않으면 파일이 접두사 '경로'와 함께 /destination에 있게 됩니다.
정상적인 상황에서 인덱스는 저장소의 내용을 포함하기 때문에 "원하는 트리를 인덱스로 읽어오기" 위해 특별히 해야 할 일은 없습니다. 그것은 이미 거기에 있습니다.
-a
플래그는 인덱스의 모든 파일을 체크아웃하는 데 필요합니다(내가 원하는 것을 수행하지 않기 때문에 이 상황에서 이 플래그를 생략하는 것이 무엇을 의미하는지 잘 모르겠습니다). -f
플래그는 이 명령이 일반적으로 수행하지 않는 출력의 기존 파일을 강제로 덮어씁니다.
이것은 내가 찾던 일종의 "git export"인 것 같습니다.
Greg Hewgillgit 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
Alexander Somov 리포지토리가 GitHub에서 호스팅되는 경우의 특별한 경우 답변입니다.
svn export
만 사용하십시오.
내가 아는 한 Github은 archive --remote
허용하지 않습니다. GitHub는 svn과 호환 되며 모든 git repos svn
액세스할 수 있으므로 GitHub URL을 약간만 조정하면 평소처럼 svn export
예를 들어 전체 리포지토리를 내보내려면 URL의 trunk
master
(또는 프로젝트의 HEAD 분기가 로 설정된 모든 항목)를 대체하는 방법을 확인하십시오.
svn export https://github.com/username/repo-name/trunk/
또한 단일 파일 또는 특정 경로나 폴더를 내보낼 수도 있습니다.
svn export https://github.com/username/repo-name/trunk/src/lib/folder
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
Anthony HatzopoulosGit 매뉴얼에서 :
git-checkout-index를 사용하여 "전체 트리 내보내기"
접두사 기능은 기본적으로 git-checkout-index를 "트리로 내보내기" 기능으로 사용하는 것을 간단하게 만듭니다. 원하는 트리를 인덱스로 읽고 다음을 수행하십시오.
$ git checkout-index --prefix=git-export-dir/ -a
jperras다음과 같이 사용할 수 있는 git-checkout-index
대한 간단한 래퍼를 작성했습니다.
git export ~/the/destination/dir
대상 디렉토리가 이미 존재하는 경우 -f
또는 --force
를 추가해야 합니다.
설치가 간단합니다. 스크립트를 PATH
어딘가에 놓고 실행 가능한지 확인하십시오.
git-export
위한 github 저장소
Daniel Schierbeck이것은 SVN보다 Git에서 문제가 덜한 것으로 보입니다. Git은 저장소 루트에 .git 폴더만 넣지만 SVN은 모든 하위 디렉터리에 .svn 폴더를 넣습니다. 따라서 "svn export"는 재귀 명령줄 마술을 피하는 반면 Git 재귀는 필요하지 않습니다.
kostmo동등한
svn export . otherpath
기존 리포지토리 내부는
git archive branchname | (cd otherpath; tar x)
동등한
svn export url otherpath
~이다
git archive --remote=url branchname | (cd otherpath; tar x)
aredridel.gitattributes
export-ignore
파일을 제외하지 않는 경우 git checkout
을 시도하십시오.
mkdir /path/to/checkout/ git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout -f -q
-NS
인덱스에서 경로를 체크아웃할 때 병합되지 않은 항목에 실패하지 마십시오. 대신 병합되지 않은 항목은 무시됩니다.
그리고
-NS
장황한 것을 피하십시오
또한 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
변경하지 않도록 지시합니다.
예:
이 명령은 readme.txt
파일을 가져옵니다.
git --git-dir=/path/to/repo/.git --work-tree=/path/to/checkout/ checkout fef2e1f2de5f3d4f5e87df7d8 -f -q -- ./libs ./docs/readme.txt
HEAD^2
뒤에 두 개의 커밋을 my_file_2_behind_HEAD.txt
생성(덮어쓰기)합니다.
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 -- ./
./
는 리포지토리의 루트에 상대적입니다.
Community Wiki나는 git-submodules를 광범위하게 사용합니다. 이것은 나를 위해 작동합니다.
rsync -a ./FROM/ ./TO --exclude='.*'
slatvickgit 저장소를 내보내는 방법을 찾을 때 이 페이지를 자주 방문했습니다. 이 질문에 대한 내 대답은 svn이 중앙 집중식 저장소 접근 방식을 따르기 때문에 svn export가 git과 비교하여 설계상 가지고 있는 세 가지 속성을 고려합니다.
--branch stable
또는 --branch release/0.9
와 같이 안정적인 분기를 복제하는 것이 유용합니다.
Lars Schillingmann그러면 .dot 파일을 제외한 모든 내용이 복사됩니다. git 복제 프로젝트를 .git 항목 없이 내 웹 앱의 git repo로 내보내는 데 이것을 사용합니다.
cp -R ./경로-to-git-repo /경로/대상/대상/
평범한 오래된 bash는 훌륭하게 작동합니다. :)
Harmon복제만큼 간단하고 .git 폴더를 삭제하십시오.
git clone url_of_your_repo path_to_export && rm -rf path_to_export/.git
teleme.ioGitHub 사용자의 경우 내보내기 URL이 임시 git archive --remote
메서드가 직접 작동하지 않습니다. 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
bishop예, 이것은 아카이브에 git을 포함하지 않고 코드를 아카이브하는 깨끗하고 깔끔한 명령이며 git 커밋 기록에 대해 걱정하지 않고 전달하는 것이 좋습니다.
git archive --format zip --output /full/path/to/zipfile.zip master
zeeawan나는 당신이
- 저장소의 하위 폴더 내보내기 (SVN 내보내기 기능을 사용하는 방법입니다)
- 해당 폴더에서 배포 대상으로 모든 것을 복사해도 괜찮습니다.
- 이미 전체 저장소의 복사본이 제자리에 있기 때문입니다.
그런 다음 언급된 git-archive master foo | -x -C [destination]
cp foo [destination]
사용할 수 있습니다. git-archive master foo | -x -C [destination]
.
dkinzer모든 커밋에서 zip 파일로 원격 저장소를 아카이브할 수 있습니다.
git archive --format=zip --output=archive.zip --remote=USERNAME@HOSTNAME:PROJECTNAME.git HASHOFGITCOMMIT
orkodengit-export의 Bash 구현.
'git-archive' 구현에서 재사용할 목적으로 .empty 파일 생성 및 제거 프로세스를 자체 기능으로 분할했습니다(나중에 게시됨).
또한 대상 내보내기 폴더에서 원하지 않는 파일을 제거하기 위해 '.gitattributes' 파일을 프로세스에 추가했습니다. 'git-export' 기능을 보다 효율적으로 만드는 동안 프로세스에 대한 자세한 정보를 포함했습니다.
EMPTY_FILE=".빈";
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-- 1 관리자 휠 25445901 11월 3일 12:57 /tmp/rel-1.0.0.tgz
이제 'create_empty' 기능 및 기타 기능을 사용하는 단일 프로세스에 'git archive' 기능을 통합했습니다.
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 # eg: 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; }
Community Wiki하위 모듈과 함께 작동하는 것을 원한다면 시도해 볼 가치가 있습니다.
메모:
- MASTER_DIR = 체크아웃된 하위 모듈도 체크아웃
- DEST_DIR = 이 내보내기가 끝나는 위치
- rsync가 있다면 공이 덜 아픈 상태에서 같은 일을 할 수 있을 것이라고 생각합니다.
가정:
- MASTER_DIR의 상위 디렉토리(즉, MASTER_DIR cd ..에서)에서 이것을 실행해야 합니다.
- DEST_DIR이 생성된 것으로 가정합니다. 원하는 경우 DEST_DIR 생성을 포함하도록 수정하기가 매우 쉽습니다.
cd MASTER_DIR && tar -zcvf ../DEST_DIR/export.tar.gz --exclude='.git*' . && cd ../DEST_DIR/ && tar xvfz export.tar.gz && rm export.tar.gz
Rob Jensen내 선호도는 실제로 코드의 배포 가능한 아카이브(.tar.bz2, .zip, .jar 또는 적절한 것)를 내보내는 Makefile(또는 다른 빌드 시스템)에 dist 대상을 갖는 것입니다. GNU autotools나 Perl의 MakeMaker 시스템을 사용하게 된다면 이것이 자동으로 존재한다고 생각합니다. 그렇지 않은 경우 추가하는 것이 좋습니다.
ETA(2012-09-06): 와우, 가혹한 downvotes. 나는 여전히 소스 코드 제어 도구보다 빌드 도구를 사용하여 배포판을 빌드하는 것이 더 낫다고 생각합니다. 저는 빌드 도구로 아티팩트를 만드는 것을 믿습니다. 현재 직장에서 우리의 주요 제품은 ant target으로 제작됩니다. 우리는 소스 코드 제어 시스템을 전환하는 중이며 이 ant 대상이 있다는 것은 마이그레이션의 번거로움이 하나 줄어든다는 것을 의미합니다.
skiphoppy이것은 커밋 범위(C에서 G까지)에 있는 파일을 tar 파일로 복사합니다. 참고: 이렇게 하면 파일만 커밋됩니다. 전체 저장소가 아닙니다. 여기 에서 약간 수정됨
커밋 기록 예
A --> B --> C --> D --> E --> F --> G --> H --> 나
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~ --> Commit C의 파일을 포함합니다. Commit C 이후의 파일 뿐만이 아닙니다.
| xargs tar -rf myTarFile --> tar로 출력
Fuyu Persimmon내가 질문을 이해하는 것처럼, 그것은 로컬 저장소에서 상태를 추출하는 것보다(여기에 많은 wsers가 하는 것처럼) 기록 없이, 다른 분기의 데이터 없이 서버에서 특정 상태만 다운로드하는 것에 관한 것입니다.
다음과 같이 할 수 있습니다.
git clone -b someBranch --depth 1 --single-branch git://somewhere.com/repo.git \ && rm -rf repo/.git/
-
--single-branch
는 Git 1.7.10(2012년 4월)부터 사용할 수 있습니다. -
--depth
가 ( 이었나?) 결함이 있는 것으로 알려 졌지만 수출의 경우 언급된 문제는 중요하지 않습니다.
Ondra Žižka지금까지 내가 본 가장 쉬운 방법은 (Windows에서도 작동함) git bundle
.
git bundle create /some/bundle/path.bundle --all
자세한 내용은 이 답변을 참조하십시오. USB 드라이브를 통해 Windows 컴퓨터에서 Linux 컴퓨터로 git 저장소를 복사하려면 어떻게 해야 합니까?
B T배포 스크립트에 이것이 필요했으며 위에서 언급한 접근 방식을 사용할 수 없었습니다. 대신 다른 해결책을 찾았습니다.
#!/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
troelskn쉬운 방법으로 이것은 .bash_profile에 대한 기능이며 현재 위치에서 아카이브의 압축을 직접 풀고 먼저 일반적인 [url:path]를 구성합니다. 참고: 이 기능을 사용하면 복제 작업을 피할 수 있으며 원격 저장소에서 직접 가져옵니다.
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에 대한 별칭, 동일한 구성이 필요합니다(.git 프로젝트 내에서 명령을 실행하는 데 주의 하십시오. 이 문제가 해결될 때까지 항상 이전에 여기에 언급된 기본 디렉토리로 점프합니다. 저는 개인적으로 이 기능을 선호합니다.
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' -
RkG내보내기를 생성하려는 머신에 리포지토리의 로컬 복사본이 있는 경우 제대로 작동하는 또 다른 솔루션이 있습니다. 이 경우 이 저장소 디렉토리로 이동하고 다음 명령을 입력하십시오.
GIT_WORK_TREE=outputdirectory git checkout -f
/var/www/
에서 깨끗한 버전을 체크아웃하려는 경우에 특히 유용합니다. 이 경우 .git/hooks/post-receive
스크립트에 this 명령을 추가합니다(이 상황에 더 적합한 베어 저장소의 hooks/post-receive
Tom접두사(예: 디렉토리 이름)를 추가하는 동안 zip 아카이브로 git 내보내기:
git archive master --prefix=directoryWithinZip/ --format=zip -o out.zip
DomTomCat@Aredridel 의 게시물이 가장 가까웠다고 생각하지만 거기에 조금 더 있습니다. 그래서 여기에 추가하겠습니다. 문제는 svn
에서 repo의 하위 폴더에 있고 다음을 수행하는 것입니다.
/media/disk/repo_svn/subdir$ svn export . /media/disk2/repo_svn_B/subdir
그런 다음 svn
은 개정 제어 하에 있는 모든 파일을 내보냅니다(새로 추가됨 또는 수정됨 상태일 수도 있음) - 그리고 해당 디렉토리에 다른 "정크"가 있는 경우( .svn
하위 폴더를 계산하지 않지만 보이는 항목 .o
파일과 같이) 내보내기 되지 않습니다. SVN 리포지토리에 등록된 파일만 내보내집니다. 나를 위해, 하나의 좋은 일이 수출도 아직 커밋되지 않은 로컬 변경을 가진 파일이 포함되어 있다는 것입니다; 또 다른 좋은 점은 내보낸 파일의 타임스탬프가 원본 파일과 동일하다는 것입니다. svn help export
에 따르면 다음과 같습니다.
- PATH1에 의해 지정된 작업 복사본에서 깨끗한 디렉토리 트리를 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 archive는 트리 ID가 주어졌을 때와 커밋 ID나 태그 ID가 주어졌을 때 다르게 동작합니다. 첫 번째 경우 현재 시간이 아카이브에 있는 각 파일의 수정 시간으로 사용됩니다. 후자의 경우 참조된 커밋 개체에 기록된 커밋 시간이 대신 사용됩니다.
... 그러나 분명히 두 경우 모두 " 각 파일의 수정 시간"을 설정합니다. 따라서 해당 파일의 실제 타임스탬프를 보존 하지 않습니다!
따라서 타임스탬프를 보존하기 위해 다소 복잡하지만 실제로는 "한 줄짜리"인 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 \ )
/media/disk/git_svn/subdir
)의 내용을 내보내는 것으로 가정하고 내보내는 대상이 다소 불편하게 배치되지만 DEST
환경 변수에 있습니다. . 이 스크립트를 사용하면 주의하십시오. 위의 스크립트를 실행하기 전에 DEST
디렉토리를 수동으로 생성해야 합니다.
스크립트를 실행한 후 다음을 비교할 수 있어야 합니다.
ls -la /media/disk/git_svn/subdir ls -la /media/diskC/tmp/subdirB # DEST
... 동일한 타임스탬프를 볼 수 있기를 바랍니다(버전 제어를 받는 파일에 대해).
이것이 누군가를 돕기를 바랍니다.
건배!
sdaauBrandon내 .bashrc 파일에 다음 유틸리티 기능이 있습니다. git 저장소에 현재 분기의 아카이브를 만듭니다.
function garchive() { if [[ "x$1" == "xh" || "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 }
MichaelMoser출처 : http:www.stackoverflow.com/questions/160608/do-a-git-export-like-svn-export