내 git repo의 하위 디렉토리 만 Heroku에 배포 / 푸시하려면 어떻게해야합니까?


121

Serve 를 사용 하고 Git을 사용하여 버전을 제어 하는 프로젝트가 있습니다. Serve는 outputHeroku에 배포하려는 정적 파일이 있는 폴더를 만듭니다 .

Heroku Cedar 스택이 너무 좋아 보이지 않기 때문에 Serve 프로젝트 자체를 배포하고 싶지 않지만 가장 중요한 것은 정적 웹 사이트에 대한 Heroku의 훌륭한 지원을 활용하고 싶습니다.

자식 원격에 하위 폴더를 배포하는 방법이 있습니까? output폴더에 Git 리포지토리를 만들고 (잘못 들리는) Heroku에 푸시해야합니까?


1
하위 모듈을 찾을 수 있습니다. book.git-scm.com/5_submodules.html
greg0ire 2011-09-24

답변:


220

git-subtree 를 통한 더 쉬운 방법 이 있습니다 . 'output'폴더를 Heroku의 루트로 푸시한다고 가정하면 다음을 수행 할 수 있습니다.

git subtree push --prefix output heroku master

현재 git-subtree가 git-core에 포함되어있는 것으로 보이지만 해당 버전의 git-core가 아직 릴리스되었는지는 모르겠습니다.


1
네,하지만 하위 트리는 여전히 git installer를 통해 포함되지 않습니다 ( 1.8.0.2 기준) . 다행히 소스에서 설치하는 것은 빠르고 간단합니다. 이 페이지 는 Mac에서 저에게 효과적이었습니다.
dribnet

14
필요한 --force경우 git push heroku `git subtree split --prefix output master`:master --force. stackoverflow.com/a/15623469/2066546을 참조하십시오 .
fiedl 2011

2
그러나 특정 태그를 푸시하는 올바른 방법은 무엇입니까? 나는 그것이되어야한다고 생각했다 git subtree push --prefix output heroku +refs/tags/v1.0.0:refs/heads/master. 그러나 이것은 작동하지 않고 +refs/tags/v1.0.0:refs/heads/master does not look like a ref. 나중에 특정 태그로 롤백하려면 이런 종류의 기능이 필요합니다. 올바른 방법은 무엇입니까?
데니스

1
나는 오류 '푸쉬 가지 팁은 원격 뒤에 있기 때문에 업데이트가 거부 된'수
앨리

2
@ and-dev @Eric Burel 을 지정할 필요없이 outputdevelop브랜치 에만 있는 폴더를 브랜치 에 성공적으로 푸시 했으므로 현재 체크 아웃 한 브랜치에서 지정한 대상 브랜치로 푸시됩니다. heroku masterdevelop:master
cprcrack

10

나는 John Berryman이 말한 것으로 시작했지만 실제로 heroku git 역사에 대해 전혀 신경 쓰지 않으면 더 간단 할 수 있습니다.

cd bin
git init
git add .
git commit -m"deploy"
git push git@heroku.com:your-project-name.git -f
rm -fr .git

공식 git subtree이 가장 좋은 대답 이라고 생각 하지만 Mac에서 하위 트리를 작동시키는 데 문제가 있습니다.


9

비슷한 문제가있었습니다. 제 경우에는 heroku 저장소의 모든 것을 날려 버리고 내 하위 디렉토리에있는 것으로 바꾸는 것이 결코 문제가되지 않았습니다. 이 경우 다음 bash 스크립트를 사용할 수 있습니다. Rails 앱 디렉토리에 넣으십시오.

#!/bin/bash

#change to whichever directory this lives in
cd "$( dirname "$0" )"

#create new git repository and add everything
git init
git add .
git commit -m"init"
git remote add heroku git@heroku.com:young-rain-5086.git

#pull heroku but then checkback out our current local master and mark everything as merged
git pull heroku master
git checkout --ours .
git add -u
git commit -m"merged"

#push back to heroku, open web browser, and remove git repository
git push heroku master
heroku open
rm -fr .git

#go back to wherever we started.
cd -

이 문제를 개선 할 수있는 방법이 많이 있다고 확신합니다. 방법을 알려주세요!


+1감사. 이 솔루션은 Heroku에서 git 로그에 신경 쓰지 않는다면 훌륭하게 작동합니다. 배포 할 응용 프로그램 하위 경로 내에서 무시할 폴더가있는 경우 스크립트 위를 조정할 수 있습니다. 예를 들어 나는 specheroku에 폴더를 원하지 않았습니다 . 예제 요점
ch4nd4n

+1하지만 당신은하지 않고 단순히 당겨 Heroku가 마스터로 병합에 의해 단순화 할 수 있습니다git push --force heroku master
MK 사피을

4

길고 힘든 한 달 동안 다른 일을 시도하고 깨달을 때마다 물린 후,

Heroku는 배포 메커니즘으로 git 저장소를 사용하기 때문에이를 git 저장소로 취급해서는 안됩니다.

그것은 rsync 일 수도 있었을 것입니다. 그들은 git로갔습니다. 이것 때문에 산만하지 마십시오.

그렇게한다면 모든 종류의 상처를 입을 수 있습니다. 앞서 언급 한 모든 솔루션은 어딘가에서 비참하게 실패합니다.

  1. 매번 또는 주기적으로 수행해야하거나 예기치 않은 일이 발생해야합니다 (하위 모듈 푸시, 하위 트리 동기화 등).
  2. 예를 들어 코드를 모듈화하기 위해 엔진을 사용하면 Bundler가 당신을 죽일 것입니다. 이에 대한 좋은 해결책을 찾기 위해 그 프로젝트에 대해 내가 겪었던 좌절의 정도를 설명하는 것은 불가능합니다
    • 엔진을 git repo 링크 + bundle deploy-실패, 매번 번들 업데이트해야합니다.
    • 엔진을 :path+ bundle deploy-실패 로 추가하려고 하면 개발 팀은 :path옵션을 "이 gem 옵션과 함께 Bundler를 사용하지 않습니다"로 간주 하므로 프로덕션 용으로 번들로 제공되지 않습니다.
    • 또한 엔진을 새로 고칠 때마다 레일 스택을 업데이트하려고합니다. -_-
  3. 내가 찾은 유일한 해결책 /vendor은 개발시 심볼릭 링크로 엔진을 사용 하고 실제로 프로덕션을 위해 파일을 복사하는 것입니다.

해결책

문제의 앱에는 git root에 4 개의 프로젝트가 있습니다.

  1. api-프로필에 따라 2 개의 다른 heroku 호스트에서 실행됩니다-업로드 및 API
  2. web-웹 사이트
  3. web-old-이전 웹 사이트, 아직 마이그레이션 중
  4. common-엔진에서 추출 된 공통 구성 요소

모든 프로젝트에는 엔진 vendor/common의 루트를 보는 심볼릭 링크 가 있습니다 common. heroku에 배포하기 위해 소스 코드를 컴파일 할 때 심볼릭 링크를 제거하고 rsync해야합니다. 코드는 물리적으로 각 개별 호스트의 공급 업체 폴더에 있습니다.

  1. 호스트 이름 목록을 인수로받습니다.
  2. 개발 리포지토리에서 git push를 실행 한 다음 별도의 폴더에서 깨끗한 git pull을 실행하여 더티 (커밋되지 않은) 변경 사항이 호스트에 자동으로 푸시되지 않도록합니다.
  3. 호스트를 병렬로 배포합니다-모든 heroku git repo가 ​​풀리고 새 코드가 올바른 위치로 rsync되고 git commit 주석의 기본 푸시 정보로 커밋됩니다.
  4. 결국, 우리는 컬과 함께 핑을 보내서 취미 주인에게 일어나서 모든 것이 와인이되었는지 확인하기 위해 통나무를 꼬리를 달도록 지시합니다.
  5. 젠킨스와도 잘 어울립니다 : D (성공적인 테스트 후 테스트 서버로 자동 코드 푸시)

이제 6 개월 동안 최소한의 (아니요?) 문제로 야생에서 매우 잘 작동합니다.

다음은 스크립트 https://gist.github.com/bbozo/fafa2bbbf8c7b12d923f입니다.

업데이트 1

@AdamBuczynski, 결코 그렇게 간단하지 않습니다.

첫째, 최소한 프로덕션 및 테스트 환경은 항상 있어야하며, 더 나쁜 경우에는 기능별 클러스터가 많이 있습니다. 갑자기 1 개의 폴더가 매우 기본적인 요구 사항으로 n heroku 프로젝트에 매핑되어야하며 모든 것이 어떻게 든 구성되어야합니다. 스크립트는 배포 할 소스를 "인식"합니다.

두 번째로, 프로젝트간에 코드를 공유하고 싶을 것입니다. 이제 sync_common개발중인 심볼릭 링크가 포함 된 shennanigans가 Heroku에서 실제 rsynced 코드로 대체됩니다. 공통 스레드를 보석으로 추출하고 싶습니다.

세 번째로 CI를 연결하고 하위 폴더와 git repo를 구성하는 방법이 약간 변경되며, 결국 가장 간단한 사용 사례에서 앞서 언급 한 요점으로 끝납니다.

다른 프로젝트에서는 Java 빌드를 연결해야합니다. 소프트웨어를 여러 클라이언트에 판매 할 때 설치 요구 사항 및 기타 사항에 따라 설치되는 모듈을 필터링해야합니다.

나는 정말로 Rakefile이나 무언가로 묶는 것을 탐구하고 그런 식으로 모든 것을해야합니다 ...


안녕하세요 @bbozo, 솔루션을 약간 압축하여 하나의 특정 하위 폴더를 하나의 특정 heroku 프로젝트에 배포하고 Heroku에 필요하지 않거나 특정하지 않은 모든 항목을 제거하는 사용 사례에 맞게 만들 수 있습니까?
Adam Reis

답변을 업데이트 해 주셔서 감사합니다. 나는 총알을 깨고 클라이언트와 서버 측 코드를 별도의 저장소로 나눌 것이라고 생각합니다. 우리의 상황에 이상적이지는 않지만, 우리가 지금해야하는 강제 하위 트리 푸시를 능가 할 것이며, 제가 모은 것은 심볼릭 링크를 사용하는 것보다 훨씬 간단 할 것입니다.
Adam Reis

"배포 스크립트"를 두려워하지 마십시오. 효과가 있습니다
bbozo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.