2013-02-12 26 views
6

Tôi đang cố gắng đặt vào các ảnh chụp nhanh liên tiếp của git về một dự án cụ thể. Tôi đang làm điều này bằng cách Populating thư mục kho lưu trữ với các nội dung của mỗi ảnh chụp và sau đó chạyLàm cách nào để kiểm soát ngưỡng đổi tên khi cam kết tệp dưới git?

git add -A . 
git commit -m 'Version X' 

Đây là phương pháp đề nghị trong this answer. Tuy nhiên, tôi thấy rằng các cam kết nhận ra tập tin đổi tên chỉ khi 100% nội dung tập tin vẫn giữ nguyên. Có cách nào để ảnh hưởng đến việc phát hiện đổi tên của git commit để làm cho nó tìm thấy đổi tên nơi nội dung tập tin đã thay đổi một chút? Tôi thấy rằng git mergegit diff có các tùy chọn khác nhau để kiểm soát ngưỡng đổi tên, nhưng các tùy chọn này không tồn tại cho git commit.

Những điều tôi đã cố gắng:

  • Định vị các tập tin đổi tên với một kịch bản home-brew, và thực hiện một cam kết với các tập tin ban đầu được đổi tên thành địa điểm mới của họ trước khi cam kết các nội dung tập tin mới. Tuy nhiên, điều này giới thiệu một cam kết nhân tạo, và có vẻ không phù hợp, bởi vì nó không sử dụng chức năng phát hiện đổi tên của git.
  • Tạo một nhánh riêng biệt cho mỗi ảnh chụp và sau đó kết hợp các chi nhánh liên tiếp vào master sử dụng

    git merge -s recursive -Xtheirs -Xpatience -Xrename-threshold=20

    Tuy nhiên, điều này để lại cho tôi với các tập tin đổi tên của phiên bản cũ tại chỗ, trong khi cũng thất bại trong việc phát hiện các đổi tên.

+1

Có quan trọng không? Việc đặt một tùy chọn như vậy trong 'git commit' sẽ chỉ ảnh hưởng đến giao diện người dùng của lệnh đó; Git không thực sự theo dõi các đổi tên. –

+0

Tôi muốn 'git log --follow' để làm việc trên các đổi tên. Với một chuỗi đồng bằng các cam kết, nó dừng lại ở phiên bản mới nhất của tệp. –

Trả lời

10

git commit không bao giờ phát hiện đổi tên. Nó chỉ viết nội dung vào kho lưu trữ. Đổi tên (và bản sao cũng) chỉ được phát hiện sau sự kiện, tức là khi chạy git diff, git merge và bạn bè. Đó là vì git không lưu trữ bất kỳ thông tin đổi tên/sao chép nào.

+1

Đầu ra của 'git commit' cho biết liệu một số tệp đã được đổi tên hay chưa. Tôi đã thấy rằng khi đầu ra này chỉ ra một sự đổi tên, tôi có thể theo dõi lịch sử của tập tin bằng 'git log --follow'. Đây là những gì tôi whish để thực hiện. –

+1

Nhưng thông tin đó là * không được lưu trữ *, do đó, nó không có ý nghĩa đối với 'git-commit' để có một tùy chọn như vậy. –

+1

Tôi đã được sidetracked bởi thực tế là một cam kết với cùng một nội dung trong vị trí mới dường như cải thiện heuristics được sử dụng bởi 'git log --follow'. –

9

Như được nêu trong các nhận xét và câu trả lời khác, điều này không có ý nghĩa khi điều chỉnh ngưỡng phát hiện đổi tên trong cam kết, vì điều này sẽ chỉ thay đổi đầu ra của lệnh, chứ không phải những gì thực sự được lưu trữ trong cam kết.

Tuy nhiên, bạn có thể sẽ điều chỉnh ngưỡng phát hiện đổi tên trong lệnh git log. Bạn làm điều này bằng cách sử dụng tham số --find-renames. Điều này chủ yếu đạt được kết quả mà tôi muốn đạt được.

+0

git log --find-renames chỉ hiển thị cho tôi nhật ký cam kết. Tôi biết rằng tôi cần phải thay đổi tỷ lệ phần trăm sao chép/đổi tên nhưng tôi chưa thấy bất kỳ ví dụ cú pháp trực tiếp nào.Bạn có thể chỉ hơi cụ thể hơn không? – anon58192932

+0

The --find-renames thay đổi ngưỡng. Tôi không biết các tùy chọn cung cấp cho bạn khả năng kiểm soát tốt hơn. –

+0

Tôi tìm thấy thêm về vấn đề chính xác của mình. Tôi thực hiện một tấn thay đổi mã của tôi trong suốt một ngày. Bao gồm những thứ như thêm tệp và xóa. Sau đó tôi chạy git add * .java để thêm tất cả các thay đổi của tôi vào danh sách thay đổi hiện tại. Và git không chính xác giả định rằng một số tập tin được đổi tên mà không ai trong số họ. Để giải quyết vấn đề này, tôi phải git thêm các tập tin được giả định không chính xác để được đổi tên thành một danh sách thay đổi độc quyền, cam kết chúng, và sau đó thực hiện một cam kết khác với tất cả các tệp khác. Vì vậy, tôi đã hy vọng thay đổi ngưỡng tìm tên nhưng không thể tìm thấy nó cho lệnh git add – anon58192932

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