2013-04-23 12 views
6

Tôi gặp sự cố khi cố gắng kéo các thay đổi mới nhất của mình từ TFS và thêm chúng vào repo BitBucket. Tôi đã đẩy thành công các chi nhánh của mình vào BitBucket, nhưng khi tôi cố gắng lấy bất kỳ checkins mới nào từ TFS, tôi luôn nhận được một cuộc xung đột hợp nhất.Sử dụng tìm nạp git-tfs để tìm nguyên nhân mới nhất xung đột hợp nhất

bước:

  1. git tfs clone http://TFS-ADDRESS/Collection $/Project/Name/Branch
  2. git tfs init-branch $/Project/Name/NewBranch NewBranchName
  3. git push -u origin --all

Tại thời điểm này repo BitBukcet tôi có tất cả các file và lịch sử của tôi từ TFS. Sau đó tôi đã kiểm tra cho tôi $/Project/Name/NewBranch trên TFS.

Bây giờ tôi muốn nhận các thay đổi mới nhất từ ​​TFS và thêm/cam kết chúng vào kho lưu trữ BitBucket Lưu ý: Tại thời điểm này, không có nhánh nào khác trong TFS hoặc BitBucket đã thay đổi. Sự thay đổi duy nhất là check-in duy nhất của tôi vào TFS

Khi tôi thực hiện như sau trên NewBranch của tôi, tôi nhận được một cuộc xung đột nhập:

git tfs pull 

Auto-merging Source/build.version 
CONFLICT (content): Merge conflict in Source/build.version 

Theo như tôi có thể nói, nó đang cố gắng để nhập các thay đổi từ "master" của tôi đến "NewBranch" của tôi, mặc dù NewBranch là mã mới nhất. Lệnh kéo ptfs đang kéo checgeset xuống cuối cùng, nhưng sau đó cố gắng thực hiện hợp nhất. Nếu tôi sử dụng

git tfs fetch --all 

Tôi thấy changeset được liệt kê, nhưng tôi không thể cam kết/đẩy nó vào kho lưu trữ BitBucket. Tôi không thể tìm thấy một tài liệu tham khảo trực tuyến để nói những gì tôi đang làm sai, hoặc những bước tôi cần phải thực hiện (Tôi mới đến Git). Có ai giúp được không?

tôi cuối cùng muốn tự động hoá này vì vậy bất kỳ check-in trong TFS có thể được lấy và được bổ sung vào kho BitBucket (cho đến khi chúng tôi cuối cùng di chuyển tất cả các nhà phát triển để BitBucket)

Cảm ơn

EDIT tôi đang cố gắng để thay đổi từ TFS sang BitBucket. Không có gì được thêm vào TFS từ BitBucket.

Tất cả công việc được thực hiện trên chi nhánh (xem bên dưới). Người dùng đang làm việc trong TFS. Người dùng cam kết thay đổi của họ ở đó. LƯU Ý: Không ai thực hiện chỉnh sửa đối với repo BitBucket. Nó là một bản sao của TFS. Mỗi ngày một lần, tôi muốn kéo các thay đổi mới nhất cho mỗi nhánh TFS xuống thư mục git cục bộ của tôi và chúng đẩy chúng vào BitBucket. Các "git tfs lấy" lấy changesets:

D:\development\workspaces\git\anothertry>git tfs fetch --all 
C83419 = 3abdaedf571369dce15f74a52697d86069f87d6d 

nhưng "tình trạng git" nói với tôi không có gì để cam kết

D:\development\workspaces\git\anothertry>git status 
# On branch Feature 
nothing to commit, working directory clean 

là Và khi tôi cố gắng đẩy changeset này vào BitBucket, git nói với tôi không có gì để cam kết.

Chi nhánh

Master---o---------------o----o--o-o--o------- 
      \   ///// 
      Feature-----o----o--o-o--o 

Trả lời

0

Tôi không hiểu chính xác những gì bạn làm xấu nhưng có somethings mà bạn nên bây giờ trong việc sử dụng git-TFS ...

  • Làm việc với một chi nhánh TFS Tôi thấy rằng bạn tạo ra một chi nhánh (bước 2) và cam kết trong ngành đó. Khi bạn đã checkouted chi nhánh của bạn 'NewBranchName', bạn nên checkin bằng lệnh:

    git tfs rcheckin -i NewBranchName

và kéo thay đổi với:

git tfs pull -i NewBranchName 

hoặc (với rebase)

git tfs pull -r -i NewBranchName 

Nếu bạn không chỉ định tùy chọn -i với tên của điều khiển từ xa TFS, bạn sẽ kiểm tra trong bạn cam kết trong các chi nhánh chính (ở đây, $/dự án/Tên/Branch) :(

  • dấu tại cam kết của bạn trên TFS tôi cung cấp cho bạn trên các lệnh để kiểm tra trong cam kết của bạn. Nhưng bạn nên biết rằng, vì một số lý do, khi bạn kiểm tra một git commit trong TFS, một changeset mới trong TFS được tạo ra (đó là những gì chúng ta muốn;)) và sau khi một git commit mới được tạo ra. Nó gần giống như bản gốc nhưng với một số thông tin (bạn có thể thấy trong bình luận git). Do thực tế này, tùy thuộc vào những gì bạn làm (và tôi không hiểu chính xác cái gì), bạn có thể gặp vấn đề vì git cố gắng hợp nhất cam kết với chính xác cùng một sửa đổi ở cùng một vị trí, vì vậy không hợp nhất được automaticaly.

Trong thực tế, tôi nghĩ rằng có điều gì đó sai trong luồng công việc của bạn vì bạn không nên gặp sự cố này. Cố gắng tìm ra vấn đề trong quy trình làm việc của bạn.

Tôi hy vọng điều đó sẽ hữu ích.

Hãy thoải mái để xem wiki git-TFS: https://github.com/git-tfs/git-tfs/wiki Tôi hy vọng có thông tin khá hữu ích (một phần đã làm nó, với tình yêu;))

PS: Để giúp bạn tốt hơn, bạn có thể cho tôi biết đó chỉ huy bạn sử dụng để kiểm tra các cam kết của bạn? checkin, checkintoo, rcheckin? rcheckin được khuyên dùng rất nhiều!

Những gì tôi để tự động hóa công việc của bạn:

(ở đây 'bitbucket' là tên giả định của kho bitbucket từ xa của bạn)

=> trong ngành thạc sĩ của bạn:

//Do your job & commit with git & ... 
//rebase your work on TFS work 
git tfs pull -r 
//rcheckin with git-tfs 
git tfs rcheckin 
//commit in bitbucket repo 
git push bitbucket master 

= > trong chi nhánh 'NewBranchName' của bạn:

//Do your job & commit with git & ... 
//rebase your work on TFS work 
git tfs pull -r -i NewBranchName 
//rcheckin with git-tfs 
git tfs rcheckin -i NewBranchName 
//commit in bitbucket repo 
git push bitbucket NewBranchName 

PS2: Có lẽ, bạn nên có để stash sửa đổi của bạn nếu bạn có những thay đổi không được phép trong thư mục làm việc của bạn trước khi thực hiện pull-r và rcheckin ...

EDIT: Bạn chỉnh sửa, tôi chỉnh sửa;)

Trước đây, tôi giả sử rằng bạn đã xác định một từ xa cho kho bitbucket của bạn:

git remote add bitbucket https://bitbucket.org/yout_login/your_project.git 

Bạn phải chỉ để:

//checkout your branch 
git checkout NewBranchName 
//fetch the TFS changesets and merge your branch into 
git tfs pull -r -i NewBranchName 
//push your commit on bitbucket 
git push bitbucket NewBranchName 

Và để giải thích một chút những gì bạn đang làm (và không hiểu hoàn toàn:() ...

Với "git tfs fetch --all", bạn đang tìm nạp các thay đổi TFS của tất cả các nhánh nhưng không hợp nhất (hoặc rebasing) với nhánh nội bộ của bạn. Vì vậy, chúng không xuất hiện trong chi nhánh địa phương của bạn. Bạn có thể nhìn thấy DAG với lệnh để hiểu rõ hơn:

git log --oneline --graph --decorate 

Các 'tfs git pull' đưa ra ở trên hợp nhất lấy cam kết với chi nhánh của bạn do đó sẽ được tốt!

"tình trạng git" nói với tôi không có gì để cam kết

Lệnh này hiển thị cho bạn những tập tin được sửa đổi trong thư mục làm việc là. Vì vậy, đó là bình thường mà bạn thấy không có thay đổi. Điều đó có nghĩa là cam kết của bạn không bị kéo!

Và khi tôi cố gắng đẩy thay đổi này vào BitBucket, git cho tôi biết không có gì để cam kết.

Bạn nên có! Bạn có chắc chắn đã xác định điều khiển từ xa của bạn đối với kho lưu trữ bitbucket của bạn không? (xem bên trên) Bạn sử dụng lệnh nào? Git nói gì với bạn?

+0

Cảm ơn bạn đã trả lời @Philippe. –

+0

Bạn có thấy vấn đề của mình không? Tôi nghĩ đó là sự quên lãng của tùy chọn -i ... – Philippe

+0

Tôi nghĩ rằng tôi đã không mô tả vấn đề của tôi. Tôi đã chỉnh sửa câu hỏi của mình để có thêm thông tin. Về cơ bản, tôi đang cố gắng sao chép kho lưu trữ TFS trong BitBucket. Tôi không muốn thêm bất kỳ thứ gì từ BitBucket vào TFS –

2

Dường như tôi đã tìm thấy câu trả lời sau khi sử dụng Tiện ích mở rộng Git.

Có vẻ như tôi cần phải làm một lấy

git tfs fetch --all 

Điều này sẽ làm cho tôi tất cả changesets từ TFS cho thân cây của tôi và bất kỳ chi nhánh tôi đã ánh xạ (init-chi nhánh)

D:\development\workspaces\git\anothertry>git tfs fetch --all 
C83454 = f65ba8d0cc7b40f42148ba2c06d0da8b7e968c4d 
C83455 = 6c25feb6e74a09d0d3d84344002e7546044900ab 
C83459 = 91c4450d702d5a97e862aedd7ad1b5af3ff2c375 
C83460 = 5cacaba5bfe4197c1bf9fab498f51c1ba435e6ea 

Tiếp theo tôi cần phải thực hiện hợp nhất

git merge <guid> 

LƯU Ý: Thay đổi mới nhất (trong trường hợp này là 5cacaba ...)

Updating 6c25feb..5cacaba 
Fast-forward 
Source/Common/w32threads.h    | 1238 ++--- 
Source/xxxxxxx_Service/ServerAgent.cpp | 3638 ++++++------- 
Source/xxxxxxx_Service/ServerAgent.h | 449 +- 
Source/xxxxxxx_Service/User.cpp  | 9073 ++++++++++++++++---------------- 
Source/xxxxxxx_Service/User.h   | 647 +-- 
Source/build.version     | 2 +- 
6 files changed, 7562 insertions(+), 7485 deletions(-) 

Và, cuối cùng, đẩy những thay đổi của tôi để BitBucket

git push --all 

Vì vậy, có vẻ như tôi đã thiếu git merge cuộc gọi và các thông số để vượt qua nó.

Cheers

+0

fetch --all là một chút quá mức cần thiết (xem tất cả các điều khiển từ xa để nhận được thay đổi và do TFS, mất thời gian) và hợp nhất của bạn chỉ hoạt động nếu bạn đang ở trong các chi nhánh tốt nếu không bạn sẽ có một cái gì đó bạn không mong đợi! Vì vậy, "git tfs kéo -r -i NewBranchName" sẽ tốt hơn .. Sau đó push to bitbucket ... PS: "pull" = "fetch Hợp nhất "+" " – Philippe

+0

git tf fetch --deep – hfrmobile

0

Các tfs git fetch lệnh không cập nhật kho git địa phương của bạn, đó là lý do tại sao bạn nên làm git merge sau đó.

Để làm như vậy trong một lệnh đơn giản là kéo từ TFS remote hiện

git tfs pull -r 

này nên cập nhật kho git địa phương với tất cả các cập nhật mới từ TFS máy chủ

Tại thời điểm này bạn chỉ cần đẩy cập nhật tới git server:

git push -u origin --all