2011-04-02 26 views
5

Tôi đã viết một tập lệnh 'triển khai' rất đơn giản chạy dưới dạng móc nối post-update của tôi bên trong repo git trống của tôi.GIT & Ruby: Làm thế nào tôi có thể bỏ đặt biến GIT_DIR từ bên trong một tập lệnh ruby?

Các biến như sau

live domain   = ~/mydomain.com 
staging domain  = ~/stage.mydomain.com 
git repo location = ~/git.mydomain.com/thisrepo.git (bare) 

core    = ~/git.mydomain.com/thisrepo.git 
core    == added remote into each live & stage gits 

cả live & stage đã khởi Repos git (không trần) và tôi đã thêm repo trần của tôi như là một từ xa để mỗi người trong số họ (tên core) để git pull core stage hoặc git pull core live sẽ kéo các tệp được cập nhật từ branch tương ứng của repo core.

Kịch bản là như sau:

#!/usr/bin/env ruby 

# Loop over each passed in argument 
ARGV.each do |branch| 

    # If it matches the stage then 'update' the staging files 
    if branch == "refs/heads/stage" 

    puts "" 
    puts "Looks like the staging branch was updated." 
    puts "Running a tree checkout now…" 
    puts "" 
    `cd ~/stage.mydomain.com` 
    `unset GIT_DIR` # <= breaks! 
    `git pull core stage` 
    puts "" 
    puts "Tree pull completed on staging branch." 
    puts "" 

    # If it's a live site update, update those files 
    elsif branch == "refs/heads/live" 

    puts "" 
    puts "Looks like the live branch was updated." 
    puts "Running a tree checkout now…" 
    puts "" 
    `cd ~/mydomain.com` 
    `unset GIT_DIR` # <= breaks! 
    `git pull core live` 
    puts "" 
    puts "Tree checkout completed on live branch." 
    puts "" 

    end 

end 

Tôi đã cố gắng thích nghi với những 'cập nhật' các tập tin từ this bash script here trong đó sử dụng các unset GIT_DIR để chạy git lệnh tiếp theo git pull core stage ví dụ. core là số remote của số bare repo của tôi trong một thư mục khác trên máy chủ.

Tuy nhiên khi thực hiện kịch bản trên tôi nhận được các lỗi sau đây:

remote: hooks/post-update:35: command not found: unset GIT_DIR   
remote: fatal: /usr/lib/git-core/git-pull cannot be used without a working tree.   

Có cách nào để làm điều tương tự như unset GIT_DIR trong một kịch bản bash trong kịch bản ruby ​​của tôi?

Rất cám ơn,

Jannis

Trả lời

6

này trông giống như

`cd ~/stage.mydomain.com && unset GIT_DIR && git pull core stage` 

có thể thực hiện công việc.

suy đoán về lý do tại sao (suy đoán như tôi không quen thuộc với ruby): bạn đang chạy các lệnh unset trong một vỏ khác nhau từ một trong những mà chạy git pull (và như samold điểm ra trong câu trả lời của mình, cùng một vấn đề xảy ra với thư mục làm việc hiện tại).

Điều này gợi ý rằng có thể có một số ruby ​​API điều khiển ruby ​​môi trường đi tới vỏ nó khởi chạy với toán tử backtick, và cũng có thể thay đổi thư mục làm việc hiện tại.

+0

này hoạt động giống như ma thuật! Cảm ơn nhiều. Có tất cả và chạy ngay bây giờ!Off để tìm hiểu cách làm tương tự bằng cách chuyển qua một chú thích được định dạng đặc biệt vào ghi chú cam kết :) Tôi tự hỏi nếu một cái gì đó như '[update: live]' hay '[update: stage]' có thể được sử dụng để kích hoạt 'pull 'action ... – Jannis

+0

Chỉ cần cứu tôi một nỗi thất vọng - Cảm ơn bạn! Không nhận ra những biến này có ý nghĩa như vậy! –

4

Hãy thử thay thế dòng của bạn với điều này:

ENV['GIT_DIR']=nil 

Tôi không chắc chắn của bạn:

`cd ~/stage.mydomain.com` 
`unset GIT_DIR` # <= breaks! 
`git pull core stage` 

phần sẽ làm việc ngay cả khi GIT_DIR đã đúng unset; mỗi backticks bắt đầu một shell mới, không liên quan đến shell cũ, và các shell con không thể thay đổi thư mục làm việc hiện tại của các tiến trình cha của chúng.

Hãy thử điều này:

ENV["GIT_DIR"]=nil 
`cd ~/stage.mydomain.com ; git pull core stage` 
+0

Cảm ơn lời khuyên! Điều này cũng tốt như câu trả lời __ndim __ nhưng bởi vì kịch bản cuối cùng của tôi đang sử dụng chuỗi đơn của mình ở định dạng ve sau, tôi đã chọn chấp nhận câu trả lời của anh ấy thay vì câu trả lời này. Bất kể cảm ơn nhiều lần nữa! – Jannis

+1

@Jannis, phụ thuộc vào mục tiêu của bạn: câu trả lời của @ ndim tốt hơn nếu bạn không muốn đặt 'GIT_DIR' cho lệnh gọi _one_ đó. Mỏ là tốt hơn nếu bạn muốn 'GIT_DIR' bỏ đặt cho toàn bộ tập lệnh. Họ làm những việc khác nhau :) nên chọn cái nào phù hợp với công việc tốt hơn. – sarnold

+0

Ồ, .. bây giờ bạn đề cập đến nó, điều đó có ý nghĩa hoàn toàn! Cảm ơn bạn đã cho tôi biết về điều này, trong trường hợp này tôi sẽ giữ nó như là 'unset ..' nhưng đối với những cuộc phiêu lưu kịch bản trong tương lai, điều này chắc chắn sẽ rất tiện dụng. Cảm ơn một lần nữa. – Jannis

Các vấn đề liên quan