[git] Git에서 폴더 구조로 수정 및 추가 된 파일 만 내보내기

특정 커밋에서 수정 및 추가 된 파일 목록을 가져 와서 내보내고 파일 구조로 패키지를 생성하고 싶습니다.

아이디어는 패키지를 가져 와서 서버에서 추출하는 것입니다. 여러 가지 이유로 리포지토리를 자동으로 가져 오는 후크를 만들 수 없으며 서버를 업데이트하는 가장 쉬운 방법은이 패키지를 생성하는 것입니다.



답변

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id
  1. git diff-tree -r $commit_id:

    주어진 커밋의 차이를 부모 (들) (상위 디렉토리뿐만 아니라 모든 하위 디렉토리 포함)로 가져갑니다.

  2. --no-commit-id --name-only:

    커밋 SHA1을 출력하지 마십시오. 전체 diff 대신 영향을받는 파일의 이름 만 출력합니다.

  3. --diff-filter=ACMRT:

    이 커밋에서 추가, 복사, 수정, 이름 변경 또는 유형이 변경된 파일 (예 : 파일 → 심볼릭 링크) 만 표시합니다. 삭제 된 파일은 제외됩니다.



주석 에서 업데이트 : 질문 컨텍스트와 아래 주석을 기반으로 다음 명령 ACMRT을 사용하여 .tar파일을 폴더 구조 의 파일로 가져올 수 있습니다 .

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | tar -czf file.tgz -T -


답변

git diff-tree -r --no-commit-id --name-only --diff-filter=ACMRT $commit_id | xargs tar -rf mytarfile.tar

이를 마무리하기 위해 다음은 tar에 파이프 된 명령입니다. 파일을 tar 아카이브로 내 보냅니다.


답변

다음은 Windows 7에서 작동하는 한 줄 명령입니다. 저장소의 최상위 폴더에서 실행하십시오.

for / f “usebackq tokens = *”% A in (`git diff-tree -r –no-commit-id –name-only –diff-filter = ACMRT HEAD ~ 1 HEAD`) do echo FA | xcopy “% ~ fA” “C : \ git_changed_files \ % A”

  • echo FA 는 파일을 복사하는지 디렉토리 (파일)를 복사하는지에 대한 불가피한 xcopy 질문과 파일 덮어 쓰기 (모두 덮어 쓰기)에 대한 가능한 질문에 답합니다.
  • usebackq 를 사용하면 git 명령의 출력을 do 절의 입력으로 사용할 수 있습니다.
  • HEAD ~ 1 HEAD 는 이전 커밋과 현재 HEAD의 모든 차이점을 가져옵니다.
  • % ~ fA 는 git 출력을 정규화 된 경로로 변환합니다 (슬래시를 백 슬래시로 변경해야 함).
  • C : \ git_changed_files \ 는 다른 모든 파일을 찾을 수있는 곳입니다.


답변

커밋 해시가 예를 들어 a9359f9 인 경우이 명령은 다음과 같습니다.

git archive -o patch.zip a9359f9 $(git diff --name-only a9359f9^..a9359f9)

프로젝트 디렉토리 구조는 그대로 유지하면서 커밋에서 수정 된 파일을 추출하여 patch.zip에 배치합니다.

약간 장황하면 커밋 해시가 세 번 언급되었지만 저에게는 작동하는 것 같습니다.

여기에있어 : http://tosbourn.com/2011/05/git/using-git-to-create-an-archive-of-changed-files/


답변

Tortoise Git 을 사용하여 diff 를 MS Windows로 내보낼 수 있습니다 .

나는 오른쪽 버튼으로 클릭하고 TortoiseGit > 로그 표시를 하고 로그 메시지가 공개됩니다.

두 버전을 선택하고 비교하십시오. 차이 가 열립니다.

파일을 선택하고 선택 항목을 … 폴더로 내보내기 !

여기에 이미지 설명 입력


답변

테스트 서버를 업데이트하고 버전 2.1 이후 변경된 파일을 추가해야했습니다.
나를 위해 James Ehly가 게시 한 것과 유사한 솔루션을 사용했지만 제 경우에는 두 개의 이전 태그-tag_ver_2.1 및 tag_ver_2.2의 유일한 커밋이 아닌 아카이브 패키지로 내보내고 싶었습니다.

예 :

tag_ver_2.1 = 1f72b38ad
tag_ver_2.2 = c1a546782

다음은 수정 된 예입니다.

git diff-tree -r --no-commit-id --name-only c1a546782 1f72b38ad | xargs tar -rf test.tar


답변

아래 명령은 나를 위해 일했습니다.

마지막 커밋으로 변경된 파일의 차이를 원하는 경우 :

git archive -o update.zip HEAD $(git diff --name-only HEAD HEAD^)

또는 두 개의 특정 커밋 간의 차이를 원하는 경우 :

git archive -o update.zip sha1 $(git diff --name-only sha1 sha2)

또는 커밋되지 않은 파일이있는 경우 git 방식은 모든 것을 커밋하는 것이며 브랜치는 저렴합니다.

git stash
git checkout -b feature/new-feature
git stash apply
git add --all
git commit -m 'commit message here'
git archive -o update.zip HEAD $(git diff --name-only HEAD HEAD^)