2009-05-07 29 views
26

Tôi đang sử dụng cả mercurial và git cho các dự án khác nhau và giống như cả hai. Những gì tôi thấy một chút khó chịu về mercurial là "trạng thái hg" cho thấy đường dẫn liên quan đến gốc kho, không vào thư mục hiện tại (không giống như git). Hành vi này có thể được tinh chỉnh bằng cách nào đó không?Mercurial "hg status" và đường dẫn tương đối

+0

Tôi nghĩ một tùy chọn trong .hgrc nên được thêm vào, xem http://bz.selenic.com/show_bug.cgi?id=3835 để biết yêu cầu tính năng. –

Trả lời

28

Cách giải quyết thông thường là để chạy:

hg status $(hg root) 

Đối với phiên bản cũ của Mercurial, trước 1.7, bạn có thể sử dụng hack này, thêm vào ".hg/HGRC" tập tin của kho lưu trữ của bạn:

[alias] 
sst = status /path/to/root 

Cần mở rộng bí danh, vì vậy bạn có thể phải thêm "alias =" vào tệp ~/.hgrc của mình.

Bắt đầu với Mercurial 1.7, phần mở rộng bí danh đã tìm hiểu về "!" thoát để sử dụng các lệnh shell, vì vậy bây giờ bạn có thể có một bí danh toàn cầu mà thực hiện điều này:

[alias] 
sst = !hg status $($HG root) $HG_ARGS 

Không sử dụng st = !hg status $(hg root), vì đó tạo ra một vòng lặp vô hạn, chạy tình trạng hg hơn và hơn. Nó trông giống như một lỗi trong phân tích cú pháp alias - nếu bạn muốn bí danh hg status để hiển thị các đường đi từ gốc, sau đó câu thần chú sau đây hoạt động trong $ toàn cầu HOME/.hgrc:

[alias] 
__mystatus = status 
st = !hg __mystatus $($HG root) $HG_ARGS 
+1

Cảm ơn! Thật đáng buồn là bí danh ext. không cho phép các lệnh shell vào lúc này, vì vậy, tôi sẽ đặt "hg status $ (hg root)" thành một bí danh bash thay thế. – pachanga

+0

Ví dụ bí danh cuối cùng của bạn sẽ không chuyển sang bất kỳ tùy chọn nào về trạng thái (như --quiet). Dòng cuối cùng phải là 'st =! Hg __mystatus $ ($ HG root) $ HG_ARGS' – krupan

+0

@krupan thanks! Tôi đã cập nhật câu trả lời với mẹo đó. Tôi hiếm khi sử dụng đối số cho trạng thái vì vậy tôi đã không gặp vấn đề. – richq

35

Để xem tình trạng không gian làm việc tương đối vào thư mục hiện tại, bạn luôn có thể sử dụng "." (Một dấu chấm duy nhất) làm đối số của "tình trạng hg", ví dụ:

% hg root     # root of the workspace 
/work/foo 

% pwd      # current directory is <root>/src 
/work/foo/src 

% hg status     # no argument, see all files 
M etc/foo.conf    # all files are shown with paths 
M src/foosetup.c   # relative to workspace root 
% 

Sự khác biệt khi bạn rõ ràng yêu cầu cho các thư mục làm việc hiện nay là các đường dẫn tên tập tin tương đối sử dụng như là điểm khởi đầu của họ:

% hg status .    # see only files under current path 
M foosetup.c 
% 
+0

Giải pháp tốt hơn và sạch hơn so với phiên bản "được chấp nhận". – vadipp

+6

Thật không may, không chính xác giống nhau, hạn chế hơn, so với giải pháp được chấp nhận. Do đó không phổ biến hơn và sạch hơn. "trạng thái hg". chỉ báo cáo trạng thái cho cây con bên dưới., sử dụng đường dẫn tương đối. Trạng thái báo cáo "hg status $ (hg root)" cho toàn bộ repo, sử dụng đường dẫn liên quan đến CWD. Bởi vì rất khó để hiển thị điều này trong một bình luận, tôi đang thêm một câu trả lời mới với các ví dụ. –

2

Hg trở nên tốt hơn theo thời gian: Với hg 2.2.3, tôi có thể xác định st bí danh.

[alias] 
st = !hg status $($HG root) $HG_ARGS 

Do đó:

  • hg st sẽ cung cấp cho bạn đường dẫn tương đối đến thư mục hiện
  • hg status sẽ cung cấp cho bạn đường dẫn tương đối đến thư mục gốc hg
2

tôi thêm câu trả lời này không phải vì nó tốt hơn câu trả lời được chấp nhận, nhưng bởi vì nó làm rõ sự khác biệt giữa "trạng thái hg." và "hg status $ (hg root)". Mà có thể đã nhầm lẫn một số người bình luận - tồi tệ hơn, có thể dẫn đến quên để kiểm tra trong công cụ cần thiết.

"trạng thái hg". chỉ báo cáo trạng thái cho cây con bên dưới., sử dụng đường dẫn tương đối.

"trạng thái hg $ (hg root)" báo cáo trạng thái cho toàn bộ repo, sử dụng đường dẫn tương đối với CWD.

Cả hai đều hữu ích.

(Nói chung, "đường dẫn trạng thái hg" hiển thị trạng thái cho đường phụ bên dưới đường dẫn (toàn bộ repo nếu đường dẫn = $ (hg root) ", nhưng liên quan đến CWD.(Tôi phải thừa nhận rằng tôi thấy điều này khó hiểu, bởi vì có hai điều xảy ra: subtree để có được trạng thái, và cwd để hiển thị đường dẫn tương đối.))

Điều này được thể hiện bằng ví dụ về phiên trình bao được nhúng bên dưới.

$ bash [~/hack] 562 $> mcd hg-test 
./hg-test 
$ bash [~/hack/hg-test] 563 $> hg init . 
$ bash [~/hack/hg-test] 564 $> mkdir subdir 
$ bash [~/hack/hg-test] 565 $> touch foo 
$ bash [~/hack/hg-test] 566 $> touch subdir/bar 
$ bash [~/hack/hg-test] 567 $> hg status 
? foo 
? subdir/bar 
$ bash [~/hack/hg-test] 552 $> hg status $(hg root) 
? foo 
? subdir/bar 
$ bash [~/hack/hg-test] 552 $> cd subdir 
./subdir 
$ bash [~/hack/hg-test/subdir] 553 $> hg status 
? foo 
? subdir/bar 
$ bash [~/hack/hg-test/subdir] 553 $> hg status . 
? bar 
$ bash [~/hack/hg-test/subdir] 513 $> hg status $(hg root) 
? ../foo 
? bar 
$ bash [~/hack/hg-test/subdir] 523 $> hg status 
? foo 
? subdir/bar 

Do đó, nếu bạn muốn làm một cái gì đó giống như làm một bản sao lưu các tập tin trong cây con địa phương, mà không kiểm tra trong, và sau đó trở lại (tôi thường cần phải làm điều này khi sử dụng "khóa hg", bởi vì tôi đang sử dụng file FrameMaker mà không thể được diffed hoặc sáp nhập trong vòng hg (hoặc hầu như không gì cả)):

$ bash [~/hack/hg-test/subdir] 523 $> mkdir bak; hg status -n . | xargs cp --target-directory bak 
$ bash [~/hack/hg-test/subdir] 524 $> ls bak 
bar 

Nhưng nếu bạn muốn sao lưu tất cả các file trong cây được báo cáo theo tình trạng

$ bash [~/hack/hg-test/subdir] 528 $> mkdir bak-root; hg status -n $(hg root) | xargs cp --target-directory bak-root 
cp: will not overwrite just-created `bak-root/bar' with `bar' 
$ bash [~/hack/hg-test/subdir] 529 $> ls bak-root 
bar foo 

bằng wa y, cảnh báo hiển thị các vấn đề về tên tệp xung đột. Tôi thường sử dụng một công cụ nhỏ, tôi phải thêm hậu tố .bak hoặc xargs. Nhưng ví dụ này là đủ.

Bằng cách này^2, tôi thường làm những việc như thế này với "hg status -nm", nhưng ví dụ trên là đủ.

2

Cách tiêu chuẩn mà làm việc kể từ khi phiên bản đồng bóng cũ (> = 1.1 so với năm 2008) là:

hg status re: 

trong đó sản lượng:

M ../contrib/buildrpm 
M ../hg 
M httprepo.py 

Từ lanh lợi 1,3 (2009) bạn có thể xác định một số alias nếu bạn muốn:

[alias] 
sst = status re: 

Hành vi này cuối cùng đã được ghi nhận ở 3.4 (2015):

$ hg help status --verbose 
[...] 
- show changes in the working directory relative to the current directory 
    (see 'hg help patterns' for more information): 

    hg status re: 

Từ lanh lợi 4.2 (có thể 2017) bạn có thể nói lệnh tình trạng luôn luôn in đường dẫn tương đối đặt này trong hgrc của bạn:

[commands] 
status.relative = True 

kiểm tra trực tiếp trên dòng lệnh (hg> = 4.2):

$ hg --config commands.status.relative=True status 
M ../contrib/buildrpm 
M ../hg 
M httprepo.py 

Cuối cùng, lanh lợi 4,3 giới thiệu ui.tweakdefaults đó, trong số những thứ khác, thay đổi một số giá trị mặc định cho những người hiện đại hơn:

[ui] 
# hg status prints relative paths 
# hg diff produces patches in git format 
tweakdefaults = True 

Nếu bạn đang ở trên một đồng bóng hiện đại (> = 4.3), đây là chính thức đề nghị đường.

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