2013-08-19 30 views
5

Tôi có một nhà phát triển hoạt động trên một thư mục và một thư mục khác hoạt động trên một thư mục khác. Tôi muốn cập nhật sản xuất với một thư mục cụ thể Tôi đang tìm kiếm một lệnh như:Git chỉ tìm một thư mục

cd /myproject 
git pull myfolder 

và hy vọng rằng chỉ Myfolder sẽ được cập nhật

Có thể?

ok, tôi sẽ rephrase ... Tôi có một dự án, một chi nhánh và hai nhà phát triển và hai thư mục trong dự án. mỗi nhà phát triển hoạt động trên một thư mục. cả hai thay đổi và đẩy chúng vào nhánh.

Tôi muốn chỉ kéo các thay đổi của một thư mục vào máy cục bộ của mình

Cơ bản/Đơn giản phải không?

+0

Câu hỏi của bạn không phải là rất rõ ràng . Giả sử bạn có các thư mục 'dev1',' dev2' và 'production'. Bạn đang hỏi làm thế nào để mang lại tất cả những thay đổi từ 'production' từ một nhánh khác, hay bạn đang hỏi làm thế nào về cơ bản thiết lập nội dung của' production' thành một trong các thư mục dev? Dù bằng cách nào, cách bạn tiếp cận âm thanh này giống như cách bạn làm việc với công cụ. – jszakmeister

+0

ok, tôi sẽ rephrase ... Tôi có một dự án, một chi nhánh và hai nhà phát triển và hai thư mục trong dự án. mỗi nhà phát triển hoạt động trên một thư mục. cả hai thay đổi và đẩy chúng vào nhánh. Tôi muốn chỉ kéo các thay đổi của một thư mục vào máy cục bộ – fredy

+0

Bạn đang sử dụng Git để quản lý một bản sao làm việc? Hay bạn thực sự chỉ muốn tìm nội dung của một thư mục trong kho lưu trữ trên máy của bạn? Đánh giá bởi bình luận của bạn cho PherricOxide, nó nghe như sau. – jszakmeister

Trả lời

1

Bạn có một số loại chi nhánh sản xuất nào không? Giả sử một dev và chi nhánh sản xuất ...

# Get all the changes from the dev branch 
git checkout dev 
git pull origin dev 

# Checkout the production branch 
git checkout production 

# Checkout the dev version of the folder you want 
git checkout dev myfolder 

# Commit all the changes that are now showing up. 

Đây là một cách khủng khiếp để làm việc, bởi vì bạn đang mất lịch sử thay đổi khi bạn thanh toán và đề xuất chỉ thư mục đó.

+0

Cảm ơn nhưng có lẽ tôi không rõ lắm ... tôi muốn chỉ nhận được các cập nhật của một thư mục. tôi không muốn làm bất kỳ thanh toán nào. Cho phép nói cả hai nhà phát triển thực hiện một số cam kết cho cùng một chi nhánh nhưng tôi muốn chỉ nhận được các thay đổi của một thư mục – fredy

+0

Lệnh thanh toán thứ 3 của bạn không chính xác. Nó phải là 'git checkout dev - myfolder' (' dev' và 'myfolder' được hoán đổi). – jszakmeister

4

Giả sử bạn đang thực sự yêu cầu là để lấy từ xa tập tin từ một kho git , mà không cần phải một cái cây làm việc của riêng bạn (hoặc một bản sao của kho địa phương), bạn có thể làm điều này:

git archive --format=tgz --remote=<url-to-repo> master -- myfolder | tar zxvf - 

Điều này nói để tạo bóng nhựa gzipped của nhánh chính của kho lưu trữ sống tại <url-to-repo>, nhưng chỉ bao gồm các nội dung theo myfolder. Đường ống thông qua tar sẽ hủy lưu trữ dữ liệu và đặt nó trong thư mục hoạt động hiện tại.

Nếu bạn đang thực sự cố gắng quản lý một cây đang hoạt động và làm việc với hai nhà phát triển khác , thì những gì bạn đang yêu cầu làm thực sự chống lại hạt của công cụ . Nhưng bạn sẽ phải phức tạp hơn nhiều về những gì bạn đang cố gắng để thực hiện một đề xuất tốt cho luồng công việc.

Cập nhật:

Vì vậy, nó âm thanh như nếu bạn muốn lấy chỉ là một thay đổi thư mục ở một cây làm việc quản lý . Xin lỗi, nhưng Git không hoạt động theo cách đó. Như tôi đã nói trong các ý kiến ​​ bên dưới, Git quản lý cây của các tệp. Nó không cho phép một phần của một cây được sửa đổi, và một phần khác để được sửa đổi khác nhau như bạn đang đề xuất - có lẽ bạn là người dùng trước đây của Subversion, nơi đây có thể là ?

Bạn có thể nhận được hiệu ứng tương tự như những gì bạn muốn, nhưng bạn phải sửa đổi bản sao làm việc của mình. Tôi sẽ không cam kết sửa đổi trừ khi bạn muốn loại bỏ một trong các nhà phát triển của bạn hoạt động.Bạn có thể để điều này:

$ git fetch 
$ git checkout @{u} -- myfolder 

git fetch sẽ mang lại tài liệu tham khảo từ xa của bạn đến nay - nó sẽ lấy thông tin mới nhất từ ​​máy chủ. git checkout @{u} -- myfolder sẽ làm cho myfolder giống như những gì tồn tại trong nhánh theo dõi. Điều này có hai hậu quả:

  • Bạn không có tất cả những thay đổi về chi nhánh địa phương của bạn (và bạn không muốn họ, vì vậy đó là okay), và

  • myfolder sẽ hiển thị như là được sửa đổi vì nội dung của myfolder có được cập nhật với phiên bản mới nhất có sẵn từ kho lưu trữ từ xa, nhưng nó là không giống với bản sửa đổi hiện tại của bạn.

Để có được bản sao làm việc của bạn trở lại bình thường, làm như sau:

$ git checkout -- myfolder 

Từ đó, bạn gọi theo cơ chế thông thường của bạn để nhận chi nhánh của bạn to-date lên với điều khiển từ xa (có khả năng git pull).

Điều này, tuy nhiên, có lẽ không phải là cách bạn muốn hoạt động. Mặc dù nhận xét của bạn, "không quan trọng trường hợp sử dụng", nó thực sự quan trọng. Thường có các cách tốt hơn để thực hiện mục tiêu tổng thể của bạn và quản lý sự phát triển của bạn, nhưng đòi hỏi phải hiểu những gì bạn đang cố gắng làm. Tại thời điểm này, những gì bạn đề xuất thực sự đi ngược lại cách Git được dự định làm việc.

Vì vậy, hãy để tôi đặt một số thứ cho bạn. Nghiên cứu sử dụng các chi nhánh chủ đề như một cách để quản lý công việc phát triển đang được thực hiện, thay vì sử dụng thư mục cho mỗi nhà phát triển trong cây. Rõ ràng, thay đổi hợp lý có thể được thực hiện trên các chi nhánh và hợp nhất khi bạn kiểm tra và phê duyệt chúng để đưa vào sản xuất.

Một nơi tốt để bắt đầu là here. Nó chứa một lượng thông tin hợp lý và một số thông tin theo các liên kết đến một số kiểu công việc khác nhau của Git. Nơi bạn muốn kết thúc là nơi có cam kết đại diện cho phiên bản bạn thực sự đưa vào sản xuất , mà không phá hủy công việc mà những người khác đang làm cho bạn. Lý tưởng nhất là, bạn nên gắn thẻ nội dung được đẩy vào sản xuất theo một số cách có ý nghĩa.

Tôi biết không ai thích nghe, nhưng việc đào tạo có thể rất hữu ích trong trường hợp của bạn. GitHub cung cấp một số free online classes cũng như một số tài nguyên khác. Đánh giá từ kinh nghiệm, một khi bạn nắm bắt cách Git hoạt động và các vấn đề nó giải quyết, bạn sẽ kết thúc với một quy trình làm việc tốt hơn nhiều.

+0

Tôi có một kho lưu trữ cục bộ được cập nhật. Bây giờ cả hai nhà phát triển đã thay đổi, mỗi người trong thư mục của mình. tôi muốn "lấy" chỉ những thay đổi từ một thư mục Tôi có thể làm được không? – fredy

+0

Nếu nó được cập nhật, bạn đã có thay đổi chưa? Bạn đã thử cái gì? Bạn nên cập nhật câu hỏi của mình với thông tin đó. – jszakmeister

+0

cho phép nói rằng tôi đã kéo mọi thứ vào máy tính của mình. sau đó hai thư mục đã được cập nhật. hôm nay tôi muốn chỉ nhận được những thay đổi từ một thư mục. tôi có thể làm được không? – fredy

0

Có, thật dễ dàng để git fetch chỉ một thư mục con git. Giả sử bạn có thư mục dự án sau trong git-repo từ xa của bạn.

project/ 
    ├── code 
    └── data 

Hiện tại bạn đã sao chép dự án vào hệ thống tệp cục bộ của mình dưới dạng kho lưu trữ git.

$ cd project 
$ rm -rf code 

#now we try to fetch the "code" directory. 
$ git fetch 
$ git checkout HEAD code 

Trong trường hợp bạn đã lồng cấu trúc thư mục như,

project/ 
├── code 
│   ├── dev 
│   └── test 
└── data 

Sau đó, trong trường hợp này bạn nên sử dụng các thư mục cụ thể mà bạn muốn,

$ git checkout HEAD code/dev