Làm cách nào để thêm thư mục trống (không chứa tệp) vào kho Git?
Làm cách nào để thêm thư mục trống (không chứa tệp) vào kho Git?
Câu trả lời:
Một cách khác để làm cho một thư mục ở lại (gần như) trống (trong kho lưu trữ) là tạo một .gitignore
tệp bên trong thư mục chứa bốn dòng này:
# Ignore everything in this directory
*
# Except this file
!.gitignore
Sau đó, bạn không cần phải đặt hàng đúng cách mà bạn phải làm trong giải pháp của m104 .
Điều này cũng mang lại lợi ích là các tệp trong thư mục đó sẽ không hiển thị là "không bị theo dõi" khi bạn thực hiện trạng thái git.
Làm cho bình luận của @GreenAsJade vẫn tồn tại:
Tôi nghĩ rằng đáng chú ý là giải pháp này thực hiện chính xác những gì câu hỏi yêu cầu, nhưng có lẽ không phải là điều mà nhiều người nhìn vào câu hỏi này sẽ tìm kiếm. Giải pháp này đảm bảo rằng thư mục vẫn trống. Nó nói "Tôi thực sự không bao giờ muốn các tập tin được kiểm tra ở đây". Trái ngược với "Tôi chưa có bất kỳ tệp nào để đăng ký tại đây, nhưng tôi cần thư mục ở đây, các tệp có thể đến sau".
README
bên trong .gitignore
tệp (dưới dạng nhận xét).
Bạn không thể. Xem Câu hỏi thường gặp về Git .
Hiện tại, việc thiết kế chỉ số git (khu vực tổ chức) chỉ cho phép các tệp được liệt kê và không ai đủ thẩm quyền để thực hiện thay đổi để cho phép các thư mục trống đã quan tâm đủ về tình huống này để khắc phục.
Thư mục được thêm tự động khi thêm tệp bên trong chúng. Đó là, các thư mục không bao giờ phải được thêm vào kho lưu trữ và không được theo dõi riêng.
Bạn có thể nói "
git add <dir>
" và nó sẽ thêm các tập tin vào đó.Nếu bạn thực sự cần một thư mục tồn tại trong thanh toán, bạn nên tạo một tệp trong đó. .gitignore hoạt động tốt cho mục đích này; bạn có thể để trống hoặc điền vào tên của các tệp bạn muốn hiển thị trong thư mục.
git mv
vì git sẽ phàn nàn rằng thư mục mới không nằm dưới sự kiểm soát phiên bản
.gitignore
Bí quyết là một câu trả lời thường xuyên, và đáp ứng nhiều nhu cầu. Tuy nhiên , có thể làm cho git theo dõi một thư mục thực sự trống rỗng , xem câu trả lời của tôi
.gitkeep
cho mục đích này.
Tạo một tập tin trống được gọi .gitkeep
trong thư mục và thêm nó.
.keep
thay thế.
.gitkeep
đã không được Git quy định và sẽ khiến mọi người đoán lần thứ hai về ý nghĩa của nó, điều này sẽ dẫn họ đến các tìm kiếm google, điều này sẽ dẫn họ đến đây. Quy .git
ước tiền tố nên được dành riêng cho các tệp và thư mục mà chính Git sử dụng.
.git
ước tiền tố nên được bảo lưu ..." Tại sao? Có git yêu cầu đặt phòng này?
README
hoặc ABOUT
tập tin sẽ chỉ là tốt hoặc tốt hơn. Để lại một ghi chú cho anh chàng tiếp theo, giống như tất cả chúng ta đã từng làm điều đó trước URL.
Bạn luôn có thể đặt một tệp README trong thư mục với lời giải thích lý do tại sao bạn muốn thư mục này, nếu không, trống trong kho lưu trữ.
touch .keep
Trên Linux, điều này tạo ra một tệp trống có tên .keep
. Đối với những gì nó có giá trị, tên này là bất khả tri đối với Git, trong khi đó .gitkeep
sẽ là cụ thể cho Git. Thứ hai, như một người dùng khác đã lưu ý, .git
quy ước tiền tố nên được dành riêng cho các tệp và thư mục mà chính Git sử dụng.
Ngoài ra, như được lưu ý trong một câu trả lời khác , thư mục có thể chứa một mô tả README
hoặc README.md
tập tin thay thế.
Tất nhiên, điều này đòi hỏi sự hiện diện của tệp sẽ không khiến ứng dụng của bạn bị hỏng.
.keep
tệp hoặc chỉ cần bỏ qua nó. Nếu thay vào đó, các tập tin trong thư mục sẽ bị bỏ qua, đó là một câu hỏi hoàn toàn khác.
git clean -nd | sed s/'^Would remove '// | xargs -I{} touch "{}.keep"
sẽ làm điều này trong tất cả các thư mục trống chưa được theo dõi.
Điều đầu tiên trước tiên:
Một thư mục trống không thể là một phần của cây trong hệ thống phiên bản Git .
Nó chỉ đơn giản là sẽ không được theo dõi. Nhưng có những kịch bản trong đó các thư mục trống "phiên bản" có thể có ý nghĩa, ví dụ:
cache/
hoặc logs/
thư mục, nơi chúng tôi muốn cung cấp thư mục nhưng .gitignore
nội dung của nóNhiều người dùng đề xuất:
README
tệp hoặc một tệp khác với một số nội dung để làm cho thư mục không trống, hoặc.gitignore
tệp với một loại "logic đảo ngược" (nghĩa là bao gồm tất cả các tệp), ở cuối, phục vụ cùng một mục đích của cách tiếp cận # 1.Trong khi cả hai giải pháp chắc chắn hoạt động, tôi thấy chúng không phù hợp với cách tiếp cận có ý nghĩa đối với phiên bản Git.
.gitignore
để làm một việc ( giữ các tệp) trái ngược với ý nghĩa của nó ( không bao gồm các tệp), mặc dù điều đó là có thể?Sử dụng một tệp trống được gọi .gitkeep
để buộc sự hiện diện của thư mục trong hệ thống phiên bản.
Mặc dù nó có vẻ không phải là một sự khác biệt lớn như vậy:
Bạn sử dụng một tệp có mục đích duy nhất là giữ thư mục. Bạn không đặt ở đó bất kỳ thông tin nào bạn không muốn đặt.
Chẳng hạn, bạn cũng nên sử dụng READMEs, READMEs với thông tin hữu ích, không phải là lý do để giữ thư mục.
Tách biệt các mối quan tâm luôn là một điều tốt, và bạn vẫn có thể thêm một .gitignore
để bỏ qua các tệp không mong muốn.
Việc đặt tên này .gitkeep
làm cho nó rất rõ ràng và đơn giản từ chính tên tệp (và cả các nhà phát triển khác , điều này tốt cho một dự án được chia sẻ và một trong những mục đích cốt lõi của kho lưu trữ Git) rằng tệp này là
Tôi đã thấy .gitkeep
cách tiếp cận được áp dụng bởi các khung rất quan trọng như Laravel , Angular-CLI .
.gitkeep
bằng bất kỳ tên tệp không có tiền tố nào khác, bạn sẽ nhận được upvote của mình, tôi nghĩ đây là câu trả lời hay nhất và nhiều thông tin nhất. Lý do: Tôi nghĩ rằng ".git *" nên được dành riêng cho các tệp theo quy định của git, trong khi đây chỉ là một trình giữ chỗ đơn thuần. Suy đoán đầu tiên của tôi khi tôi thấy đó là ví dụ: tệp ".gitkeep" sẽ tự động bị bỏ qua (đó sẽ là một tính năng hay) nhưng đó không phải là trường hợp, phải không?
Như được mô tả trong các câu trả lời khác, Git không thể biểu thị các thư mục trống trong khu vực tổ chức. (Xem Câu hỏi thường gặp về Git .) Tuy nhiên, nếu, với mục đích của bạn, một thư mục đủ trống nếu nó chỉ chứa một .gitignore
tệp, thì bạn chỉ có thể tạo .gitignore
tệp trong các thư mục trống thông qua:
find . -type d -empty -exec touch {}/.gitignore \;
find . -name .git -prune -o -type d -empty -exec touch {}/.gitignore \;
find * -type d -empty -exec touch {}/.gitignore \;
find . -name .DS_Store -exec rm {} \;
và sau đó sử dụng biến thể ưa thích từ câu trả lời này. Hãy chắc chắn chỉ thực hiện điều này trong thư mục chính xác!
.gitignore
không có ảnh hưởng đến -empty
cờ của find
lệnh. Nhận xét của tôi là về việc loại bỏ các .DS_Store
tệp trong cây thư mục, vì vậy -empty
cờ có thể được áp dụng.
Andy Lester đã đúng, nhưng nếu thư mục của bạn chỉ cần trống, và không trống rỗng, bạn có thể đặt một .gitignore
tệp trống vào đó như một cách giải quyết.
Bên cạnh đó, đây là một vấn đề triển khai, không phải là vấn đề thiết kế lưu trữ Git cơ bản. Như đã được đề cập nhiều lần trong danh sách gửi thư của Git, lý do mà việc này chưa được thực hiện là vì không ai quan tâm đủ để gửi một bản vá cho nó, không phải là không thể hoặc không nên thực hiện.
Cách tạo thư mục nhật ký Ruby on Rails :
mkdir log && touch log/.gitkeep && git add log/.gitkeep
Bây giờ thư mục log sẽ được bao gồm trong cây. Nó rất hữu ích khi triển khai, vì vậy bạn sẽ không phải viết một thói quen để tạo các thư mục nhật ký.
Các logfiles có thể được giữ bằng cách phát hành,
echo log/dev.log >> .gitignore
nhưng bạn có thể biết điều đó.
Git không theo dõi các thư mục trống. Xem Câu hỏi thường gặp về Git để được giải thích thêm. Cách giải quyết được đề xuất là đặt một .gitignore
tệp trong thư mục trống. Tôi không thích giải pháp đó, vì.gitignore
quy ước "bị ẩn" bởi Unix. Ngoài ra không có lời giải thích tại sao các thư mục trống.
Tôi đề nghị đặt một tệp README trong thư mục trống giải thích lý do tại sao thư mục trống và tại sao nó cần được theo dõi trong Git. Với tệp README đã có, theo như Git, thư mục không còn trống.
Câu hỏi thực sự là tại sao bạn cần thư mục trống trong git? Thông thường bạn có một số loại kịch bản xây dựng có thể tạo thư mục trống trước khi biên dịch / chạy. Nếu không thì làm một cái. Đó là một giải pháp tốt hơn nhiều so với việc đặt các thư mục trống trong git.
Vì vậy, bạn có một số lý do tại sao bạn cần một thư mục trống trong git. Đặt lý do đó trong tệp README. Bằng cách đó, các nhà phát triển khác (và tương lai bạn) biết tại sao thư mục trống cần phải ở đó. Bạn cũng sẽ biết rằng bạn có thể xóa thư mục trống khi vấn đề yêu cầu thư mục trống đã được giải quyết.
Để liệt kê mọi thư mục trống, sử dụng lệnh sau:
find -name .git -prune -o -type d -empty -print
Để tạo trình giữ chỗ READMEs trong mọi thư mục trống:
find -name .git -prune -o -type d -empty -exec sh -c \
"echo this directory needs to be empty because reasons > {}/README.emptydir" \;
Để bỏ qua mọi thứ trong thư mục ngoại trừ tệp README, hãy đặt các dòng sau vào .gitignore
:
path/to/emptydir/*
!path/to/emptydir/README.emptydir
path/to/otheremptydir/*
!path/to/otheremptydir/README.emptydir
Ngoài ra, bạn chỉ có thể loại trừ mọi tệp README khỏi bị bỏ qua:
path/to/emptydir/*
path/to/otheremptydir/*
!README.emptydir
Để liệt kê mọi README sau khi chúng được tạo:
find -name README.emptydir
CẢNH BÁO: Tinh chỉnh này không thực sự hoạt động khi nó bật ra. Xin lỗi vì sự bất tiện.
Bài gốc dưới đây:
Tôi tìm thấy một giải pháp trong khi chơi với Git internals!
Tạo thư mục trống của bạn:
$ mkdir path/to/empty-folder
Thêm nó vào chỉ mục bằng cách sử dụng lệnh hệ thống ống nước và cây trống SHA-1 :
$ git update-index --index-info
040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 path/to/empty-folder
Nhập lệnh và sau đó nhập dòng thứ hai. Nhấn Entervà sau đó Ctrl+ Dđể chấm dứt đầu vào của bạn. Lưu ý: định dạng là chế độ [SPACE] loại [SPACE] SHA-1hash [TAB] đường dẫn (tab rất quan trọng, định dạng câu trả lời không bảo tồn nó).
Đó là nó! Thư mục trống của bạn là trong chỉ mục của bạn. Tất cả bạn phải làm là cam kết.
Giải pháp này ngắn và rõ ràng hoạt động tốt ( xem EDIT! ), Nhưng nó không dễ nhớ ...
Cây rỗng SHA-1 có thể được tìm thấy bằng cách tạo một kho Git trống mới, cd
vào đó và phát hành git write-tree
, cây này tạo ra cây rỗng SHA-1.
BIÊN TẬP:
Tôi đã sử dụng giải pháp này kể từ khi tôi tìm thấy nó. Nó dường như hoạt động chính xác giống như cách tạo một mô hình con, ngoại trừ việc không có mô-đun nào được xác định ở bất cứ đâu. Điều này dẫn đến lỗi khi ban hành git submodule init|update
. Vấn đề là git update-index
viết lại 040000 tree
phần đó thành160000 commit
.
Hơn nữa, bất kỳ tệp nào được đặt dưới đường dẫn đó sẽ không được Git chú ý, vì nó nghĩ rằng chúng thuộc về một số kho lưu trữ khác. Điều này là khó chịu vì nó có thể dễ dàng bị bỏ qua!
Tuy nhiên, nếu bạn chưa (và sẽ không) sử dụng bất kỳ mô hình con Git nào trong kho lưu trữ của mình và thư mục "trống" sẽ vẫn trống hoặc nếu bạn muốn Git biết về sự tồn tại của nó và bỏ qua nội dung của nó, bạn có thể đi cùng điều chỉnh này. Đi theo cách thông thường với các mô hình con mất nhiều bước hơn mà điều chỉnh này.
git svn dcommit
với kết quả mong muốn không?
Giả sử bạn cần một thư mục trống có tên tmp :
$ mkdir tmp
$ touch tmp/.gitignore
$ git add tmp
$ echo '*' > tmp/.gitignore
$ git commit -m 'Empty directory' tmp
Nói cách khác, bạn cần thêm tệp .gitignore vào chỉ mục trước khi bạn có thể nói với Git bỏ qua nó (và mọi thứ khác trong thư mục trống).
echo bla > file
bạn sẽ không nhận file: File exists
vì >
sẽ ghi đè lên các tập tin nếu nó đã có hoặc tạo một hình mới nếu nó không tồn tại.
/bin/sh
giả định văn hóa! * Nếu "ở đây" là csh
và biến noclobber
được đặt, bạn thực sự sẽ nhận được file: File exists
. Nếu ai đó nói "Tôi hiểu điều này", đừng cho rằng họ là một thằng ngốc và trả lời "Không, bạn không". * c2.com/cgi/wiki?AmericanCestationAsscharge
Có thể việc thêm một thư mục trống có vẻ như đó sẽ là đường dẫn ít kháng cự nhất vì bạn có các tập lệnh mong muốn thư mục đó tồn tại (có thể vì đó là mục tiêu cho các nhị phân được tạo). Một cách tiếp cận khác là sửa đổi tập lệnh của bạn để tạo thư mục khi cần .
mkdir --parents .generated/bin ## create a folder for storing generated binaries
mv myprogram1 myprogram2 .generated/bin ## populate the directory as needed
Trong ví dụ này, bạn có thể kiểm tra một liên kết tượng trưng (bị hỏng) đến thư mục để bạn có thể truy cập nó mà không cần tiền tố ".generated" (nhưng đây là tùy chọn).
ln -sf .generated/bin bin
git add bin
Khi bạn muốn dọn sạch cây nguồn của mình, bạn có thể chỉ cần:
rm -rf .generated ## this should be in a "clean" script or in a makefile
Nếu bạn thực hiện phương pháp kiểm tra được đề xuất trong một thư mục gần như trống rỗng, bạn có một sự phức tạp nhỏ trong việc xóa nội dung mà không xóa tệp ".gitignore".
Bạn có thể bỏ qua tất cả các tệp được tạo bằng cách thêm phần sau vào gốc .gitignore:
.generated
.generated
thư mục ban đầu không tồn tại. Nó sẽ không còn bị phá vỡ một khi bạn thực hiện việc xây dựng của mình.
Tôi cũng đã phải đối mặt với vấn đề với các thư mục trống. Vấn đề với việc sử dụng tệp giữ chỗ là bạn cần tạo chúng và xóa chúng, nếu không cần thiết nữa (vì sau này có thêm thư mục con hoặc tệp. Với các cây nguồn lớn quản lý các tệp giữ chỗ này có thể bị cồng kềnh và lỗi dễ bị.
Đây là lý do tại sao tôi quyết định viết một công cụ nguồn mở có thể tự động quản lý việc tạo / xóa các tệp giữ chỗ như vậy. Nó được viết cho nền tảng .NET và chạy dưới Mono (.NET cho Linux) và Windows.
Chỉ cần xem tại: http://code.google.com.vn/p/markemptydirs
Tôi thích câu trả lời của @ Artur79 và @mjs vì vậy tôi đã sử dụng kết hợp cả hai và biến nó thành tiêu chuẩn cho các dự án của chúng tôi.
find . -type d -empty -exec touch {}/.gitkeep \;
Tuy nhiên, chỉ một số ít các nhà phát triển của chúng tôi làm việc trên Mac hoặc Linux. Rất nhiều công việc trên Windows và tôi không thể tìm thấy một lớp lót đơn giản tương đương để thực hiện tương tự ở đó. Một số người đã may mắn cài đặt Cygwin vì những lý do khác, nhưng việc kê đơn Cygwin chỉ vì điều này có vẻ quá mức cần thiết.
Chỉnh sửa để có giải pháp tốt hơn
Vì vậy, vì hầu hết các nhà phát triển của chúng tôi đã cài đặt Ant , điều đầu tiên tôi nghĩ đến là kết hợp một tệp xây dựng Ant để thực hiện việc này một cách độc lập với nền tảng. Điều này vẫn có thể được tìm thấy ở đây
Tuy nhiên , sau đó tôi nghĩ sẽ tốt hơn nếu biến nó thành một lệnh tiện ích nhỏ, vì vậy tôi đã tạo lại nó bằng Python và xuất bản nó lên PyPI tại đây . Bạn có thể cài đặt nó bằng cách chạy đơn giản:
pip3 install gitkeep2
Nó sẽ cho phép bạn tạo và xóa .gitkeep
các tệp đệ quy, và nó cũng sẽ cho phép bạn thêm tin nhắn cho chúng để các đồng nghiệp của bạn hiểu lý do tại sao các thư mục đó quan trọng. Bit cuối cùng này là tiền thưởng. Tôi nghĩ rằng nó sẽ được tốt đẹp nếu các .gitkeep
tập tin có thể tự ghi lại.
$ gitkeep --help
Usage: gitkeep [OPTIONS] PATH
Add a .gitkeep file to a directory in order to push them into a Git repo
even if they're empty.
Read more about why this is necessary at: https://git.wiki.kernel.org/inde
x.php/Git_FAQ#Can_I_add_empty_directories.3F
Options:
-r, --recursive Add or remove the .gitkeep files recursively for all
sub-directories in the specified path.
-l, --let-go Remove the .gitkeep files from the specified path.
-e, --empty Create empty .gitkeep files. This will ignore any
message provided
-m, --message TEXT A message to be included in the .gitkeep file, ideally
used to explain why it's important to push the specified
directory to source control even if it's empty.
-v, --verbose Print out everything.
--help Show this message and exit.
Tôi hy vọng bạn thấy nó hữu dụng.
Bạn không thể và không may sẽ không bao giờ có thể. Đây là một quyết định được đưa ra bởi chính Linus Torvald. Anh ấy biết những gì tốt cho chúng ta.
Có một câu nói hay ở đâu đó tôi đã đọc một lần.
Tôi tìm thấy Re: rỗng thư mục .. , nhưng có lẽ có một thư mục khác.
Bạn phải sống với cách giải quyết ... thật không may.
Khi bạn thêm một .gitignore
tệp, nếu bạn định đặt bất kỳ lượng nội dung nào vào đó (mà bạn muốn Git bỏ qua), bạn có thể muốn thêm một dòng chỉ bằng dấu hoa thị *
để đảm bảo bạn không vô tình thêm nội dung bị bỏ qua .
Không có cách nào để Git theo dõi các thư mục, vì vậy giải pháp duy nhất là thêm tệp giữ chỗ trong thư mục mà bạn muốn Git theo dõi.
Tệp có thể được đặt tên và chứa bất cứ thứ gì bạn muốn, nhưng hầu hết mọi người sử dụng một tệp trống có tên .gitkeep
(mặc dù một số người thích thuyết bất khả tri của VCS .keep
).
Tiền tố .
đánh dấu nó là một tập tin ẩn.
Một ý tưởng khác là thêm một README
tập tin giải thích thư mục sẽ được sử dụng cho mục đích gì.
Như đã đề cập, không thể thêm các thư mục trống, nhưng đây là một lớp lót thêm các tệp .gitignore trống vào tất cả các thư mục.
ruby -e 'require "fileutils" ; Dir.glob(["target_directory","target_directory/**"]).each { |f| FileUtils.touch(File.join(f, ".gitignore")) if File.directory?(f) }'
Tôi đã dán cái này vào Rakefile để dễ truy cập.
find . -type d -empty -print0 | xargs --null bash -c 'for a; do { echo "*"; echo "!.gitignore"; } >>"$a/.gitignore"; done' --
Giải pháp của Jamie Flournoy hoạt động tuyệt vời. Đây là một phiên bản nâng cao một chút để giữ .htaccess
:
# Ignore everything in this directory
*
# Except this file
!.gitignore
!.htaccess
Với giải pháp này, bạn có thể cam kết một thư mục trống, ví dụ /log
, /tmp
hoặc /cache
thư mục sẽ trống.
Tôi luôn xây dựng một chức năng để kiểm tra cấu trúc thư mục mong muốn của mình và xây dựng nó cho tôi trong dự án. Điều này giải quyết vấn đề này vì các thư mục trống được giữ trong Git bằng proxy.
function check_page_custom_folder_structure () {
if (!is_dir(TEMPLATEPATH."/page-customs"))
mkdir(TEMPLATEPATH."/page-customs");
if (!is_dir(TEMPLATEPATH."/page-customs/css"))
mkdir(TEMPLATEPATH."/page-customs/css");
if (!is_dir(TEMPLATEPATH."/page-customs/js"))
mkdir(TEMPLATEPATH."/page-customs/js");
}
Đây là trong PHP, nhưng tôi chắc chắn rằng hầu hết các ngôn ngữ đều hỗ trợ cùng chức năng và vì việc tạo các thư mục được ứng dụng chăm sóc, các thư mục sẽ luôn ở đó.
.gitkeep
quy ước là một thực hành tốt hơn nhiều.
Đây là một bản hack, nhưng thật buồn cười là nó hoạt động (Git 2.2.1). Tương tự như những gì @Teka đề xuất, nhưng dễ nhớ hơn:
git submodule add path_to_repo
).submodules
. Cam kết thay đổi..submodules
tập tin và cam kết thay đổi.Bây giờ, bạn có một thư mục được tạo khi kiểm tra cam kết. Mặc dù vậy, một điều thú vị là nếu bạn nhìn vào nội dung của đối tượng cây của tệp này, bạn sẽ nhận được:
gây tử vong: Không phải là một tên đối tượng hợp lệ b64338b90b4209263b50244d18278c0999867193
Tôi sẽ không khuyến khích sử dụng nó mặc dù nó có thể ngừng hoạt động trong các phiên bản tương lai của Git. Mà có thể để kho lưu trữ của bạn bị hỏng.
Nhiều người đã trả lời câu hỏi này. Chỉ cần thêm phiên bản PowerShell tại đây.
Tìm tất cả các thư mục trống trong thư mục
Thêm một tập tin .gitkeep trống trong đó
Get-ChildItem 'Path to your Folder' -Recurse -Directory | Where-Object {[System.IO.Directory]::GetFileSystemEntries($_.FullName).Count -eq 0} | ForEach-Object { New-Item ($_.FullName + "\.gitkeep") -ItemType file}
Nếu bạn muốn thêm một thư mục chứa nhiều dữ liệu nhất thời trong nhiều thư mục ngữ nghĩa, thì một cách tiếp cận là thêm một cái gì đó như thế này vào thư mục gốc của bạn .gitignore ...
/app/data/**/*.*
!/app/data/**/*.md
Sau đó, bạn có thể cam kết các tệp README.md mô tả (hoặc các tệp trống, không quan trọng, miễn là bạn có thể nhắm mục tiêu chúng duy nhất giống như *.md
trong trường hợp này) trong mỗi thư mục để đảm bảo rằng tất cả các thư mục vẫn là một phần của repo nhưng các tập tin (có phần mở rộng) được giữ lại bỏ qua. GIỚI HẠN:.
Không được phép trong tên thư mục!
Bạn có thể điền vào tất cả các thư mục này bằng các tệp xml / hình ảnh hoặc bất cứ thứ gì và thêm nhiều thư mục bên dưới /app/data/
thời gian khi nhu cầu lưu trữ cho ứng dụng của bạn phát triển (với các tệp README.md phục vụ để ghi trong mô tả về mỗi thư mục lưu trữ dành cho chính xác).
Không cần phải thay đổi thêm .gitignore
hoặc phân cấp của bạn bằng cách tạo một cái mới .gitignore
cho mỗi thư mục mới. Có lẽ không phải là giải pháp thông minh nhất nhưng lại rất khôn ngoan và luôn làm việc cho tôi. Đẹp và đơn giản! ;)
Một cách dễ dàng để làm điều này là bằng cách thêm một .gitkeep
tệp vào thư mục bạn muốn (hiện tại) để trống.
Xem câu trả lời SOF này để biết thêm thông tin - cũng giải thích lý do tại sao một số người tìm thấy quy ước cạnh tranh của việc thêm tệp .gitignore (như đã nêu trong nhiều câu trả lời ở đây) gây nhầm lẫn.
Thêm một lựa chọn nữa vào cuộc cạnh tranh.
Giả sử bạn muốn thêm một thư mục vào git
đó, cho tất cả các mục đích liên quan đến git
, nên để trống và không bao giờ để nội dung của nó được theo dõi, .gitignore
như được đề xuất nhiều lần ở đây, sẽ thực hiện thủ thuật.
Định dạng, như đã đề cập, là:
*
!.gitignore
Bây giờ, nếu bạn muốn một cách để làm điều này tại dòng lệnh, trong một cú trượt, trong khi bên trong thư mục bạn muốn thêm, bạn có thể thực thi:
$ echo "*" > .gitignore && echo '!.gitignore' >> .gitignore && git add .gitignore
Chính tôi, tôi có một kịch bản shell mà tôi sử dụng để làm điều này. Đặt tên cho kịch bản bất cứ điều gì bạn muốn, và thêm nó vào đâu đó trong đường dẫn bao gồm của bạn hoặc tham chiếu trực tiếp:
#!/bin/bash
dir=''
if [ "$1" != "" ]; then
dir="$1/"
fi
echo "*" > $dir.gitignore && \
echo '!.gitignore' >> $dir.gitignore && \
git add $dir.gitignore
Với điều này, bạn có thể thực thi nó từ trong thư mục bạn muốn thêm hoặc tham chiếu thư mục là tham số đầu tiên và duy nhất:
$ ignore_dir ./some/directory
Một tùy chọn khác (để đáp lại một lời nhận xét của @GreenAsJade), nếu bạn muốn theo dõi một thư mục trống mà THÁNG chứa các file được theo dõi trong tương lai, nhưng sẽ trống cho bây giờ, bạn có thể ommit *
từ .gitignore
tập tin, và kiểm tra rằng trong. Về cơ bản, tất cả các tập tin đang nói là "đừng bỏ qua tôi ", nhưng nếu không, thư mục trống và được theo dõi.
Tệp của bạn .gitignore
sẽ trông như sau:
!.gitignore
Đó là nó, kiểm tra xem, và bạn có một thư mục trống, chưa được theo dõi, mà bạn có thể theo dõi các tệp vào một lúc nào đó.
Lý do tôi khuyên bạn nên giữ một dòng trong tệp là vì nó mang lại .gitignore
mục đích. Nếu không, một số người xuống dòng có thể nghĩ để loại bỏ nó. Nó có thể giúp nếu bạn đặt một bình luận trên dòng.
Đôi khi bạn phải đối phó với các thư viện hoặc phần mềm bị viết xấu, cần một thư mục trống và thực "thực". Đặt một đơn giản .gitignore
hoặc .keep
có thể phá vỡ chúng và gây ra lỗi. Những điều sau đây có thể giúp ích trong những trường hợp này, nhưng không có gì đảm bảo ...
Đầu tiên tạo thư mục cần thiết:
mkdir empty
Sau đó, bạn thêm một liên kết tượng trưng bị hỏng vào thư mục này (nhưng trong bất kỳ trường hợp nào khác ngoài trường hợp sử dụng được mô tả ở trên, vui lòng sử dụng một README
lời giải thích):
ln -s .this.directory empty/.keep
Để bỏ qua các tập tin trong thư mục này, bạn có thể thêm nó trong thư mục gốc của bạn .gitignore
:
echo "/empty" >> .gitignore
Để thêm tệp bị bỏ qua, sử dụng một tham số để buộc nó:
git add -f empty/.keep
Sau khi xác nhận, bạn có một liên kết tượng trưng bị hỏng trong chỉ mục của bạn và git tạo thư mục. Liên kết bị hỏng có một số lợi thế, vì nó không phải là tệp thông thường và trỏ đến không có tệp thông thường. Vì vậy, nó thậm chí phù hợp với một phần của câu hỏi "(không chứa tệp)", không phải bởi ý định mà bởi ý nghĩa, tôi đoán:
find empty -type f
Lệnh này hiển thị một kết quả trống, vì không có tệp nào trong thư mục này. Vì vậy, hầu hết các ứng dụng nhận được tất cả các tệp trong một thư mục thường không thấy liên kết này, ít nhất là nếu chúng thực hiện "tệp tồn tại" hoặc "có thể đọc được". Thậm chí một số tập lệnh sẽ không tìm thấy bất kỳ tập tin nào ở đó:
$ php -r "var_export(glob('empty/.*'));"
array (
0 => 'empty/.',
1 => 'empty/..',
)
Nhưng tôi thực sự khuyên bạn chỉ nên sử dụng giải pháp này trong những trường hợp đặc biệt, một bài viết hay README
trong một thư mục trống thường là một giải pháp tốt hơn. (Và tôi không biết điều này có hoạt động với hệ thống tập tin windows không ...)
Đọc câu trả lời của @ofavre và @ stanislav-bashkyrtsev bằng cách sử dụng các tham chiếu mô hình con GIT bị hỏng để tạo các thư mục GIT, tôi ngạc nhiên rằng không ai đề xuất sửa đổi ý tưởng đơn giản này để làm cho toàn bộ điều này an toàn và an toàn:
Thay vì hack một mô hình con giả vào GIT , chỉ cần thêm một thực tế trống .
Kho lưu trữ GIT với chính xác một cam kết:
commit e84d7b81f0033399e325b8037ed2b801a5c994e0
Author: Nobody <none>
Date: Thu Jan 1 00:00:00 1970 +0000
Không có tin nhắn, không có tập tin cam kết.
Để thêm một thư mục trống cho bạn repo GIT:
git submodule add https://gitlab.com/empty-repo/empty.git path/to/dir
Để chuyển đổi tất cả các thư mục trống hiện có sang mô hình con:
find . -type d -empty -delete -exec git submodule add -f https://gitlab.com/empty-repo/empty.git \{\} \;
Git sẽ lưu trữ hàm băm cam kết mới nhất khi tạo tham chiếu mô hình con, vì vậy bạn không phải lo lắng về tôi (hoặc GitLab) khi sử dụng tệp này để tiêm các tệp độc hại. Thật không may, tôi không tìm thấy bất kỳ cách nào để buộc ID cam kết nào được sử dụng trong quá trình thanh toán, vì vậy bạn sẽ phải kiểm tra thủ công ID cam kết tham chiếu đang e84d7b81f0033399e325b8037ed2b801a5c994e0
sử dụng git submodule status
sau khi thêm repo.
Vẫn không phải là một giải pháp bản địa, nhưng điều tốt nhất chúng ta có thể có mà không cần ai đó có được bàn tay của họ thực sự , thực sự bẩn trong cơ sở mã GIT.
Bạn sẽ có thể tạo lại cam kết chính xác này bằng cách sử dụng (trong một thư mục trống):
# Initialize new GIT repository
git init
# Set author data (don't set it as part of the `git commit` command or your default data will be stored as “commit author”)
git config --local user.name "Nobody"
git config --local user.email "none"
# Set both the commit and the author date to the start of the Unix epoch (this cannot be done using `git commit` directly)
export GIT_AUTHOR_DATE="Thu Jan 1 00:00:00 1970 +0000"
export GIT_COMMITTER_DATE="Thu Jan 1 00:00:00 1970 +0000"
# Add root commit
git commit --allow-empty --allow-empty-message --no-edit
Tạo các cam kết GIT có thể lặp lại là khó khăn đáng kinh ngạc
Bạn không thể. Đây là một quyết định thiết kế có chủ ý của những người bảo trì Git. Về cơ bản, mục đích của Hệ thống quản lý mã nguồn như Git là quản lý mã nguồn và các thư mục trống không phải là mã nguồn. Git cũng thường được mô tả như một trình theo dõi nội dung và một lần nữa, các thư mục trống không có nội dung (thực tế hoàn toàn ngược lại), vì vậy chúng không được theo dõi.
Bạn có thể lưu mã này dưới dạng create_readme.php và chạy mã PHP từ thư mục gốc của dự án Git của bạn.
> php create_readme.php
Nó sẽ thêm các tệp README vào tất cả các thư mục trống để các thư mục đó sau đó sẽ được thêm vào chỉ mục.
<?php
$path = realpath('.');
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);
foreach($objects as $name => $object){
if ( is_dir($name) && ! is_empty_folder($name) ){
echo "$name\n" ;
exec("touch ".$name."/"."README");
}
}
function is_empty_folder($folder) {
$files = opendir($folder);
while ($file = readdir($files)) {
if ($file != '.' && $file != '..')
return true; // Not empty
}
}
?>
Sau đó làm
git commit -m "message"
git push
checkout
có phiên bản hiện tại của Git.