2012-08-02 34 views
7

Tôi đang cố gắng tạo một kho lưu trữ git để lưu trữ tất cả các tệp dotfiles và cấu hình của tôi. Ý tưởng của tôi là chỉ cần tạo liên kết cứng đến tất cả các tệp mà tôi quan tâm và lưu trữ các liên kết đó trong thư mục riêng của chúng mà tôi có thể biến thành một kho lưu trữ.Không thể liên kết cứng Tập tin gitconfig

Tôi đã nhấn một chút mặc dù với tệp ~/.gitconfig của mình. Dường như bất cứ khi nào tôi chạy lệnh 'git config', liên kết mà tôi đã tạo không còn trỏ đến đúng vị trí, ví dụ: tệp trong kho lưu trữ không còn cập nhật đúng nữa.

Dưới đây là ví dụ sử dụng vỏ và tương tác của ruby ​​để xác định trạng thái liên kết tệp.

# Create the link 
$ ln .gitconfig .conf_files/gitconfig # Create the link 

# The files are in fact linked 
[1] pry(main)> File.identical?('.gitconfig', '.conf_files/gitconfig') 
=> true 

# Update the gitconfig file by running a 'git config' command 
$ git config --global alias.last 'log -1 HEAD' 

# The files are no longer linked. 
[2] pry(main)> File.identical?('.gitconfig', '.conf_files/gitconfig') 
=> false 

Tôi cho rằng điều này có liên quan đến cách git đang ghi tệp .gitconfig. Có ai biết tại sao điều này sẽ xảy ra, hoặc có bất kỳ ý tưởng sáng tạo cho một workaround?

+1

cấu hình git ngắt liên kết cứng. Thay vào đó, hãy sử dụng liên kết tượng trưng. –

+0

@William Pursell Sửa tôi nếu tôi sai nhưng tôi không nghĩ git nhận ra các liên kết tượng trưng? –

+2

Đặt tệp thực trong kho git, và sau đó đặt một liên kết tượng trưng vào nó trong $ HOME. git sẽ không bao giờ thấy liên kết mềm. –

Trả lời

6

Hãy thử giải pháp Eli Barzilay trong bình luận của mình tại http://www.xxeo.com/archives/2010/02/16/dotfiles-in-git-finally-did-it.html:

Vì vậy, cuối cùng tôi đã tìm thấy một giải pháp mà có tốt nhất của cả hai: đưa repo trong thư mục con, và thay vì liên kết tượng trưng, ​​thêm một tùy chọn cấu hình cho “core.worktree” làm thư mục chính của bạn. Bây giờ khi bạn đang ở trong nhà của bạn thư mục bạn không có trong repo git (vì vậy vấn đề đầu tiên đã biến mất) và bạn không cần phải đối phó với các liên kết mềm mong manh như trong trường hợp thứ hai. Bạn vẫn còn có những rắc rối nhỏ khi loại trừ các đường dẫn mà bạn không muốn được phiên bản (ví dụ: dấu "*" trong mẹo ".git/info/exclude"), nhưng điều đó không mới.

+0

Công trình này tuyệt vời! Nó khắc phục sự cố của mọi đường dẫn được nhận diện như một lệnh git repo cho lệnh git, tránh các vấn đề cần sử dụng liên kết dưới bất kỳ hình thức nào, VÀ bạn không phải làm lộn xộn gốc của hệ thống tệp của bạn. Tôi vừa chuyển nội dung của tập tin .gitignore trong câu trả lời của tôi thành '.conf_files/.git/info/exclude' và nó hoạt động như một nét duyên dáng. Cảm ơn rất nhiều vì chuyện này! –

2

Điều này hoàn toàn bình thường và thực tế là cách được khuyến nghị để ghi đè lên các tệp cấu hình. Git tạo một tệp tạm thời, ghi ra cấu hình và sau đó di chuyển tệp mới qua tệp cũ. Bằng cách này, bạn không nhận được một tập tin cấu hình không đầy đủ (mất dữ liệu) nếu Git bị gián đoạn.

Bạn luôn có thể viết tập lệnh để sao chép hoặc liên kết các tệp cấu hình vào kho lưu trữ trung tâm của mình.

+0

Điều đó sẽ có ý nghĩa là tại sao các liên kết cứng bị hỏng, nhưng tôi đã hy vọng có thể có một cách đơn giản/gọn hơn để giữ cho các tệp giống hệt nhau. –

+0

@MattGarriott: Vấn đề thực sự ở đây là bạn đang cố gắng sử dụng Git để theo dõi các tệp * không thể * nằm trong kho lưu trữ Git. Đó chỉ là một hạn chế cơ bản về cách các hệ thống tập tin được thiết kế những ngày này, và cách Git được thiết kế. Tôi sẽ xem xét một kịch bản một cách "đơn giản và sạch sẽ" để làm điều này. Git là một loạt các kịch bản anyway. Cách khác là làm cho Git theo dõi các tệp bên ngoài kho lưu trữ của nó - trong khi điều này là kỹ thuật có thể, bạn sẽ cần phải biết cách của bạn xung quanh hệ thống ống nước Git. –

+0

Bạn hoàn toàn đúng, và đó là lý do tại sao tôi đã quyết định tiếp cận vấn đề này từ một góc nhìn khác, tôi đã đính kèm giải pháp mới của tôi làm câu trả lời cho câu hỏi này. Cảm ơn tất cả các giải thích và giúp đỡ của bạn! –

0

Thanh toán câu trả lời này, có lẽ nó có thể được giúp đỡ:

https://stackoverflow.com/a/3731139/1431696

Trong khi đó, có bạn xem làm các liên kết ngược lại? Tạo kho lưu trữ của bạn đầy đủ các tập tin cấu hình, vv, và sau đó ở nơi mà bạn thực sự sử dụng các tập tin của bạn, tạo ra một liên kết cứng đến tập tin 'thực', mà nằm trong kho.

+6

Liên kết cứng là đối xứng. Họ không đi ngược lại vì họ không đi về phía trước ngay từ đầu. –

+0

Ah có vẻ hơi bị giật. – wardd

0

Nhờ câu trả lời và lời khuyên Dietrich EPP của tôi đã quyết định để tiếp cận vấn đề này từ một góc độ khác nhau bằng cách tạo ra các kho lưu trữ tại thư mục gốc của hệ thống tập tin của tôi, và sử dụng .gitignore để theo dõi chỉ các tập tin mà tôi quan tâm.

tập tin .gitignore của tôi bây giờ trông như thế này:

/* 

!/etc/ 
/etc/* 

# etc files 
!/etc/rc.conf 
!/etc/asound.conf 
!/etc/mercurial/ 

!/home/ 
!/home/matt/ 
/home/matt/* 

# Home files 
!/home/matt/.xinitrc 
!/home/matt/.gitconfig 
!/home/matt/.bashrc 

# Vim files 
!/home/matt/.vimrc 
!/home/matt/.vim/ 
.netrwhist 

Ngoài việc không cần phải sao chép các tập tin riêng biệt và giữ chúng trong hai địa điểm riêng biệt này có các lợi ích mà tôi nên cần tôi có thể dễ dàng phục hồi các thay đổi mà không cần phải để sao chép các tệp theo cách thủ công.

Cảm ơn các bạn đã giúp đỡ!

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