Git 저장소의 gem

번들러는 git 저장소에서 직접 gem을 이용하는 기능을 추가했습니다. Gemfile에 gem을 넣는 것만큼 설정하기 쉽습니다. 최신 버전의 gem(이나 포크)도 정식 릴리스만큼 쉽게 사용하실 수 있습니다.
루비젬에는 git에 있는 gem을 제어할 수 있는 기능이 없으므로 git 저장소에서 설치한 gem은 gem list에서는 보이지 않을 것입니다. 하지만 Bundler.setup을 실행하면 사용 가능합니다.
gem으로 사용하려면 git 저장소 루트에 .gemspec 파일이 있어야 합니다.
gem 'nokogiri', :git => 'https://github.com/tenderlove/nokogiri.git'
git 저장소의 루트에 .gemspec 파일이 없다면 번들러가 의존성을 해결할 때 사용할 버전을 지정해야 합니다.
gem 'deep_merge', '1.0', :git => 'https://github.com/peritor/deep_merge.git'
git 저장소가 여러 .gemspec 파일을 가지고 있다면 gem 소스와 같은 취급을 합니다.
git 'https://github.com/rails/rails.git' do
  gem 'railties'
  gem 'action_pack'
  gem 'active_model'
end
git 저장소는 특정 ref, branch, tag만 사용합니다.
:git => 'https://github.com/rails/rails.git', :ref => '4aded'
:git => 'https://github.com/rails/rails.git', :branch => '2-3-stable'
:git => 'https://github.com/rails/rails.git', :tag => 'v2.3.5'
git 저장소의 ref, branch, tag를 한 줄로 지정해도 똑같이 동작합니다.
gem 'nokogiri', :git => 'https://github.com/tenderlove/nokogiri.git', :ref => '0eec4'
Bundler can use HTTP(S), SSH, or git
gem 'nokogiri', :git => 'https://github.com/tenderlove/nokogiri.git'
gem 'nokogiri', :git => 'git@github.com:tenderlove/nokogiri.git'
gem 'nokogiri', :git => 'git://github.com/tenderlove/nokogiri.git'
공개된 GitHub 저장소에서 gem을 가져오는 경우에는 축약해서 쓸 수 있습니다.
gem 'nokogiri', :github => 'tenderlove/nokogiri'
만약 GitHub 계정의 이름과 저장소의 이름이 같다면 생략할 수 있습니다.
gem 'rails', :github => 'rails'
NB: 이 단축은 번들러 1.x버전의 공개 저장소일 경우에만 사용할 수 있습니다. 읽기, 쓰기를 할 경우는 대신 HTTPS를 사용하세요.
gem 'rails', :git => 'https://github.com/rails/rails'
:branch:ref처럼 :git에서 보통 사용하는 옵션이 적용됩니다.
gem 'rails', :github => 'rails', :ref => 'a9752dcfd15bcddfe7b6f7126f3a6e0ba5927c56'
Bitbucket(:bitbucket), GitHub Gists(:gist)에도 비슷한 단축이 있습니다.
gem 'capistrano-sidekiq', :github => 'seuros/capistrano-sidekiq'
gem 'keystone', :bitbucket => 'musicone/keystone'

사용자 정의 git 소스

위에 사용된 :github 단축은 번들러의 내장 git 소스 중 하나입니다. 번들러에는 :github, :gist, :bitbucket이 이미 들어있고 추가도 할 수 있습니다.
Github 엔터프라이즈, Stash, 사용자 정의 git 설정을 사용 중이라면, 사용자 정의 옵션을 사용하기 전에 git_source를 호출해 사용자 정의 단축을 만들 수 있습니다. 여기에 Stash의 예제가 있습니다.
git_source(:stash){ |repo_name| "https://stash.corp.acme.pl/#{repo_name}.git" }
gem 'rails', :stash => 'forks/rails'

보안

http://git:// URL은 안전하지 않습니다. 중계 공격자(man-in-the-middle attacker)는 체크아웃할 때 코드를 변조할 수 있고 원래 체크아웃 하려 했던 코드 대신 악의적인 코드를 제공할 가능성이 있습니다. 번들러 1.x 버전에서 :github 단축이 git:// URL을 사용하기 때문에, HTTPS URL을 사용하거나 :github 단축을 재정의해 HTTPS git 소스를 사용하시길 추천 합니다.

로컬 Git 저장소

번들러는 리모트 버전을 사용하는 대신에 로컬 git 저장소를 사용하도록 할 수도 있습니다. 로컬 오버라이드를 설정하면 됩니다.
bundle config local.GEM_NAME /path/to/local/git/repository
예를 들어 로컬 Rack 저장소를 사용하려면 이렇게 호출합니다.
bundle config local.rack ~/Work/git/rack
그리고 git 저장소의 브랜치를 지정합니다.
gem 'rack', :github => 'rack/rack', :branch => 'master'

이제 리모트 git 저장소를 체크아웃하는 대신에 로컬 오버라이드가 사용됩니다. 경로(path) 소스와 비슷하게 git 저장소가 변경될 때마다 변경사항이 번들러에 의해 자동으로 반영됩니다. 이 말은 로컬 git 저장소에 커밋이 추가되면 Gemfile.lock 안의 리비전이 갱신 된다는 뜻입니다. 이렇게 하면 git 서브모듈을 사용하는 것과 같은 주의가 필요합니다. 리모트에 푸시하기 전에 로컬 오버라이드가 푸시되었는지 확인해야 합니다. 그렇지 않다면 로컬 기기에만 있는 커밋을 지정하게 됩니다.

번들러는 개발자가 유효하지 않은 참조를 사용하지 않도록 많은 검사를 수행합니다. 특히 이 기능을 사용할 때는 Gemfile에 브랜치를 지정하도록 강제합니다. Gemfile에 적혀있는 브랜치와 로컬 git 저장소의 현재 브랜치가 다르다면 번들러는 중단됩니다. 언제나 올바른 브랜치에서 작업하는지 확인하고 다른 브랜치를 사용할 때 발생할 수 있는 사고를 예방할 수 있습니다.

마지막으로 번들러는 Gemfile.lock 안의 현재 리비전이 로컬 git 저장소에도 있는지 확인합니다. 이렇게 함으로써 번들러는 리모트의 최신 변경 사항을 가져오도록 강제 할 수 있습니다.

번들러가 브랜치를 확인하길 원치 않는다면 이 옵션을 오버라이드 하세요.

bundle config disable_local_branch_check true
Fork me on GitHub
Docs: Previous Version (v1.10) Current Version (v1.11)