2009-04-28 10 views
6

Đây sẽ là một điều dài nhưng tôi hy vọng bạn có thể chịu đựng với tôi.Tại sao git để lại các tệp đã sửa đổi nằm xung quanh? Làm cách nào tôi có thể điều chỉnh quy trình làm việc của mình để làm tốt hơn?

Tôi đang cố gắng sử dụng git để đặt mã nguồn của nhóm của tôi dưới sự kiểm soát phiên bản. Sau khi cố gắng tìm các cách tiếp cận khác nhau có thể làm việc cho tôi, cuối cùng tôi đã quyết định sử dụng tính năng git format-patch. FWIW, sản phẩm là một ứng dụng web ASP.NET chạy trong Windows và tôi hiện đang sử dụng msysgit.

Bối cảnh:
Tôi có máy chủ dàn dựng (máy chủ sản xuất gương) chứa tất cả các tệp aspx. Sau đó tôi tạo một repo git bằng cách sử dụng init-db bên trong thư mục gốc của tôi và đã thực hiện git add . để theo dõi tất cả các tệp.

Để tôi có bản sao cục bộ trên máy tính xách tay của mình, tôi đã nén thư mục ".git" từ máy chủ dàn dựng và FTP vào máy cục bộ của tôi. Đổi tên nó thành "staging.git" và đã làm một số git clone staging.git webappfolder để làm phát triển của tôi chống lại.

Sau khi thực hiện 2 cam kết cho đối tượng feature1 và feature2, đã đến lúc áp dụng các thay đổi trở lại máy chủ dàn dựng. Tôi đã thực hiện một git format-patch -2 kết quả đầu ra cho các tệp 0001blah.patch0002blah.patch.

Hai tệp bản vá này sau đó được gửi tới máy chủ dàn dựng và tôi đã thực hiện một máy chủ dàn dựng tự động git am 0001blah.patch. Thực hiện git log cho thấy cam kết đã được thực hiện. Nhưng khi tôi làm một số git status, nó hiển thị Changed but not updated: modified: file1.aspx.

Điều đó có nghĩa là gì? Tôi cũng đã thử làm một số git apply 0001blah.patch nhưng tất cả những gì tôi nhận được là error" patch failed: file1.aspx: patch does not apply.

Có sự cố với quy trình làm việc của tôi không? Bất kỳ thông tin chi tiết nào liên quan đến cách thức thích hợp hoặc trợ giúp sẽ cực kỳ hữu ích. Một lần nữa, mô hình vá lỗi sẽ là khả thi nhất đối với chúng tôi ngay bây giờ vì chúng tôi sẽ không sớm thiết lập máy chủ SSH.

Trả lời

5

tôi chỉ cố gắng này:

rm -rf clone? 

# clone 1 is the working copy 
mkdir clone1 
(
    cd clone1 
    git init 
    echo foo >> file1 
    git add file1 
    git commit -m "Initial state" 
) 

# clone 2 is the staging repo 
git clone clone1 clone2 

# create patches 
(
    cd clone1 
    git tag staging # tag to track what's in staging 

    echo feature1 >> file1 
    git add file1 
    git commit -m "Feature 1" 

    echo feature2 >> file1 
    git add file1 
    git commit -m "Feature 2" 

    rm *.patch 
    git format-patch staging 
) 

# apply patches 
(
    cd clone2 
    git am ../clone1/*.patch 
    # Cygwin/msysgit line ending weirdness when patching. Aborting and 
    # reapplying clears it up. 
    git am --abort 
    git am ../clone1/*.patch 
    git log 
    git status 
) 

có những vấn đề nhỏ với các bản vá lỗi không áp dụng rõ ràng mà không làm sáng hai lần, nhưng tôi kết thúc với một dir làm việc sạch sẽ trong bản sao 2 với đúng nội dung của file1. Vì vậy, dường như không có gì sai với quy trình làm việc của bạn.

Áp dụng Git sẽ chỉ cập nhật cây đang hoạt động, không thực hiện cam kết.

Điều đó nói rằng, tôi sẽ không sử dụng kho lưu trữ git để dàn dựng. Luồng công việc của tôi có lẽ sẽ tạo một nhánh/nhánh phát hành của kho lưu trữ phát triển (hoặc không), và chỉ triển khai bản sao đầy đủ của nó.

Để cập nhật gia tăng cho môi trường dàn dựng, chỉ cần sử dụng git tag staging trong nhánh phát hành, "git diff staging..HEAD> update.patch" để gửi email và tiêu chuẩn unix "patch -p1" để áp dụng nó sẽ hoạt động. Đó là trừ khi bạn thực sự cần có lịch sử thay đổi trên máy chủ dàn dựng.

+0

"Git áp dụng sẽ chỉ" ... "sẽ chỉ là những gì"? ;) – VonC

+1

Cảm ơn SiitheMoose, sau khi thử ví dụ của bạn và không nhận được lỗi, tôi bắt đầu tự hỏi có gì sai với các tệp nguồn của mình. Điều đó nhắc tôi chỉnh sửa lại kết thúc dòng của mình và thực hiện tác vụ "git am" không có lỗi. Tôi đang đánh dấu câu trả lời này đúng vì đề xuất của bạn hoạt động cho môi trường dàn dựng của tôi. – Ghazaly

+0

Kiểm tra và mô tả tuyệt vời. +1 – VonC

3

Bạn hãy thử một

git am -3 

? Từ git-am doc,

-3 
--3way 

When the patch does not apply cleanly, fall back on 3-way merge 

Lưu ý: Từ Git Google Summer of Code 2009, có một dự án "Dạy git-áp dụng 3 chiều nhập dự phòng git-am biết":

Khi git-apply bản vá lỗi (các) tệp có thể không được vá sạch. Trong trường hợp như vậy git-apply hiện từ chối bản vá.
Nếu nó được gọi là từ git-am sau đó một 3-way merge là cố gắng theo:

  • lấy "chỉ số ..." dữ liệu từ các bản vá và
  • xây dựng một cây tạm thời,
  • áp dụng vá vào đó, sau đó
  • sáp nhập cây tạm thời với nhánh hiện tại.

Vì nhiều lý do nên thực hiện toàn bộ điệu nhảy cây tạm thời trực tiếp bên trong ứng dụng, vì có thể nói lệnh "áp dụng" của chuỗi git, tăng tốc xử lý git-am bằng cách giảm bớt , vv

+0

Tôi đã thử git am -3 nhưng kết quả vẫn như cũ nhưng dù sao, cảm ơn vì đã dành thời gian và công sức. – Ghazaly

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