Sử dụng .gitignore để bỏ qua mọi thứ trừ các thư mục cụ thể


140

Vấn đề của tôi là tôi có một loạt các trang web WordPress trong git repo của mình, trong đó tôi muốn chỉ chọn cam kết nội dung của các themesthư mục của mình , trong khi bỏ qua phần còn lại của các tệp dư thừa được tìm thấy trong WordPress.

Tôi đã sử dụng các tệp .gitignore để bỏ qua các loại tệp trước đây, nhưng nó có thể được sử dụng theo cách khác - nghĩa là bỏ qua mọi thứ NHƯNG một đường dẫn thư mục nhất định?

root (git repo)
- / wordpress
- - / (WordPress Site 1) / wp-content / Themes
- - / (WordPress Site 2) / wp-content / Themes
- - / (WordPress Site 3) / wp-content / Themes

Cảm ơn-

CẬP NHẬT:

Dựa trên các câu trả lời tôi đã làm như sau, nhưng nó không hoạt động. Có ý kiến ​​gì không?

# Ignore everything:
*
# Except for wordpress themes:
!*/wp-content/themes/*

Tôi cũng đã thử các biến thể sau:

!*/wp-content/themes*
!*wp-content/themes/*
!wp-content/themes/*
!/wordpress/*/wp-content/themes*
!wordpress/*/wp-content/themes*

Không ai trong số này đọc themescác thư mục của tôi .

Câu trả lời:


133

Đây là cách tôi đã làm - về cơ bản bạn phải đi lên các con đường, bạn không thể ký tự đại diện nhiều hơn một cấp theo bất kỳ hướng nào:

# Ignore everything:
*

# Except for the themes directories:

!wordpress/
!wordpress/*/
!wordpress/*/wp-content/
!wordpress/*/wp-content/themes/
!wordpress/*/wp-content/themes/*
!wordpress/*/wp-content/themes/*/*
!wordpress/*/wp-content/themes/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*
!wordpress/*/wp-content/themes/*/*/*/*/*

Lưu ý cách bạn phải cho phép rõ ràng nội dung cho từng cấp độ bạn muốn đưa vào. Vì vậy, nếu tôi có 5 thư mục con sâu theo chủ đề, tôi vẫn cần đánh vần nó ra.

Đây chỉ là cách nó làm việc cho tôi. Nếu ai đó quan tâm để cung cấp một lời giải thích nhiều thông tin hơn bằng mọi cách.

Ngoài ra, những câu trả lời này hữu ích:
how-do-negated-samples-work-in-gitignore
how-do-gitignore-exinating-quy tắc-thực sự làm việc


Chú ý: tôi đã cố gắng sử dụng hai ký tự đại diện 'globs' nhưng theo này mà chức năng là hệ thống phụ thuộc và nó đã không làm việc trên mac của tôi:

Đã không làm việc:

!**/wp-content/themes/
!**/wp-content/themes/**

4
trước git 1.8.4, **ký tự đại diện chỉ hoạt động nếu bạn không có dấu gạch chéo trong mẫu của mình, xem spareth think.wordpress.com/2011/07/19/ trên

Điều này sẽ hoạt động:!/wordpress/*/wp-content/themes/**/*
that0n3guy

1
Cú pháp này có hoạt động trên windows không? Nó dường như không hoạt động đối với tôi ...
ScottF

Nó hoạt động kỳ diệu trên Windows 10. Sử dụng nó cho tất cả các loại dự án tùy chỉnh từ Visual Studio Code.
klewis

Tôi đã sử dụng kết hợp câu trả lời này và câu trả lời được cung cấp bởi @, hoạt động cho tôi.
MikeyE

95

Tôi đã thử ở trên và họ đã không làm việc rất tốt. Cách tiếp cận tốt hơn như sau từ đây: https://gist.github.com/444295

# This is a template .gitignore file for git-managed WordPress projects.
#
# Fact: you don't want WordPress core files, or your server-specific
# configuration files etc., in your project's repository. You just don't.
#
# Solution: stick this file up your repository root (which it assumes is
# also the WordPress root directory) and add exceptions for any plugins,
# themes, and other directories that should be under version control.
#
# See the comments below for more info on how to add exceptions for your
# content. Or see git's documentation for more info on .gitignore files:
# http://kernel.org/pub/software/scm/git/docs/gitignore.html

# Ignore everything in the root except the "wp-content" directory.
/*
!.gitignore
!wp-content/

# Ignore everything in the "wp-content" directory, except the "plugins"
# and "themes" directories.
wp-content/*
!wp-content/plugins/
!wp-content/themes/

# Ignore everything in the "plugins" directory, except the plugins you
# specify (see the commented-out examples for hints on how to do this.)
wp-content/plugins/*
# !wp-content/plugins/my-single-file-plugin.php
# !wp-content/plugins/my-directory-plugin/

# Ignore everything in the "themes" directory, except the themes you
# specify (see the commented-out example for a hint on how to do this.)
wp-content/themes/*
# !wp-content/themes/my-theme/

1
@ nhờ dwenaus- để chia sẻ this- vẻ hữu ích cho Repos bắt nguồn từ một wordpress dir cụ thể, nhưng sẽ không làm việc trên repo w nhiều trang web wordpress bên dưới nó, mà là những gì tôi đã được đi cho ..
Yarin

Cấu trúc / mô hình này là siêu hữu ích. Tôi muốn có một repo duy nhất cho bản cài đặt Magento / WP kết hợp và với ít hơn 30 dòng .gitignore sử dụng kỹ thuật này, tôi có thể thu hẹp nó chỉ trong các tệp chủ đề / skin của Magento và các tệp chủ đề WP. Cảm ơn!
Random_user_name 22/03/13

chỉ không sử dụng thiết lập này với tự động triển khai vì người dùng git mới làm quen có thể làm rối các tệp bên ngoài các khu vực được thụt lề (ví dụ: nếu họ xóa tất cả các tệp trong repo một cách tình cờ và đó là tự động triển khai thì nó sẽ lộn xộn). Khác hơn là nó hoạt động tốt.
dwenaus

Bạn là người đàn ông anh chàng! Đặc biệt nếu phiên bản của bạn> = 2.1.4. Tham chiếu: git-scm.com/docs/gitignore/2.1.4
Haktan Suren

28

sửa đổi dòng đầu tiên

*

thay đổi nó thành

/*

2
Công việc này cho tôi. Tệp .gitignore của tôi giống như thế này / *! .Gitignore! / Nhà cung cấp
umbalaconmeogia

12

Hãy thử những câu trả lời sau:

Làm cho .gitignore bỏ qua mọi thứ trừ một vài tệp

# Ignore everything
*

# But not these files...
!.gitignore
!script.pl
!template.latex
# etc...

# ...even if they are in subdirectories
!*/

Làm cách nào để tôi bảo Git bỏ qua mọi thứ trừ thư mục con?

Điều này bỏ qua các tập tin gốc & thư mục gốc, sau đó bỏ qua thư mục bin gốc:

/*
/*/
!/bin/

Bằng cách này bạn có được tất cả các thư mục bin, bao gồm các thư mục con và các tệp của chúng.


@ cáu kỉnh- Cảm ơn, không thấy những điều này- tuy nhiên, tôi gặp khó khăn khi áp dụng chúng vào tình huống của mình. Xem các chỉnh sửa của tôi ở trên ...
Yarin

1
Liên kết thứ hai tôi đã đăng nói rằng bạn sẽ cần cả hai !*/wp-content/themes/!*/wp-content/themes/*. Bạn đã thử biến thể đó? Ngoài ra, như một giải pháp thay thế, bạn chỉ có thể sử dụng !*/wp-content/themes/và trong mỗi thư mục chủ đề có tệp .gitignore riêng với!*
kích thích

1
@ cáu kỉnh- không có biến thể đó cũng không hoạt động, và dù sao tôi cũng không thấy nó khác biệt như thế nào!*/wp-content/themes*
Yarin

9

Nếu bạn thêm tiền tố vào một mẫu có dấu chấm than ( !) thì nó phủ nhận bất kỳ mẫu nào trước đó loại trừ nó. Vì vậy, có lẽ, bạn có thể bỏ qua mọi thứ, sau đó chỉ cho phép những gì bạn muốn bằng cách sử dụng mẫu này.


@ dappawit- Cảm ơn- khái niệm có ý nghĩa và tôi đã làm cho nó hoạt động cho các tệp, nhưng không phải cho các thư mục chủ đề của tôi - xem các chỉnh sửa của tôi ở trên ...
Yarin

Tôi không phải là một chuyên gia về các mẫu toàn cầu, nhưng đọc trang người đàn ông .gitignore, tôi tin rằng điều này có thể hoạt động : !wordpress/[write out directories]/wp-content/themes/. Lưu ý dấu gạch chéo và không có dấu sao. Cũng lưu ý rằng *sẽ chỉ phù hợp với một cấp độ, không phải nhiều thư mục. Đây là trang nam: kernel.org/pub/software/scm/git/docs/gitignore.html
dappawit

Giúp tôi nhận ra tôi phải đặt phủ định sau các quy tắc khác cảm ơn
Axe

6

Tôi cần phải bỏ qua mọi thứ nhưng không phải là một thư mục có thư mục con.

Đối với tôi, điều này làm việc

# Ignore everything
/*

# Not these directories
!folder/

# Not these files
!.gitignore
!.env
!file.txt

5

Giả sử bạn có cấu trúc thư mục như thế này:

– sites
– -all
– – – -files
– – – – – -private
– – – – – – – -newspilot
– -default
– – – -files
– – – – – -private
– – – – – – – -newspilot

Khi bạn muốn chỉ cho phép các trang web / tất cả / tập tin / riêng tư / báo chícác trang web / mặc định / tập tin / riêng tư / báo chí , trước tiên, bạn có thể thử điều này:

sites/*/files/*
!sites/*/files/private/newspilot

Cái này sai! Điều khó khăn với gitignore là trước tiên bạn phải cho phép bao gồm thư mục gốc ("riêng tư") , trước khi bạn có thể cho phép thư mục con của nó ("tờ báo") được đưa vào các cam kết.

sites/*/files/*
!sites/*/files/private
sites/*/files/private/*
!sites/*/files/private/newspilot

http://www.christianengvall.se/gitignore-exclude-folder-but-include-a-subfolder/


"trước tiên bạn phải cho phép bao gồm thư mục mẹ, trước khi bạn có thể cho phép thư mục con của nó" - Cảm ơn bạn đã chỉ ra điều này! Chính xác là vấn đề của tôi.
Jet Blue

4

Câu trả lời của Yarin làm việc cho tôi, đây là phiên bản của tôi (tôi không cần /wordpressthư mục con):

*

!.gitignore
!/wp-content/
!/wp-content/themes/
!/wp-content/themes/*
!/wp-content/themes/*/*
!/wp-content/themes/*/*/*
!/wp-content/themes/*/*/*/*
!/wp-content/themes/*/*/*/*/*

# I don't want to track this one, so it's included here, after the negated patterns. 
wp-content/themes/index.php

4

Tôi luôn bị mắc kẹt ở đâu đó về điều này ngay cả sau khi trở lại câu hỏi này nhiều lần. Tôi đã đưa ra một quy trình chi tiết để thực hiện từng bước:

Đầu tiên chỉ cần sử dụng git add để thêm nội dung thực tế.

Nó sẽ hiển thị các tệp có liên quan được thêm vào chỉ mục trong khi tất cả các tệp khác vẫn chưa được theo dõi. Điều này giúp co lại .gitignoretừng bước.

$ git add wp-content/themes/my-theme/*
$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-admin/
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ...
        wp-includes/
        ...

Thêm một DUMMY.TXTtập tin tạm thời trong thư mục của bạn:

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-admin/
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ...
        wp-content/themes/my-theme/DUMMY.TXT  <<<
        ...
        wp-includes/
        ...

Mục tiêu của chúng tôi bây giờ là xây dựng các quy tắc sao cho DUMMY.TXT là duy nhất vẫn hiển thị dưới dạng Không bị bẻ khóa khi chúng tôi hoàn thành.

Bắt đầu thêm các quy tắc:

.gitignore

/*

Đầu tiên là bỏ qua mọi thứ. Các tệp không bị khóa sẽ bị xóa hết, chỉ các tệp được lập chỉ mục mới được hiển thị:

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

Thêm thư mục đầu tiên trong đường dẫn wp-content

/*
!/wp-content

Bây giờ các tệp không bị theo dõi sẽ hiển thị lại, nhưng chỉ có wp-contentnội dung của

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/plugins/
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ..

Bỏ qua mọi thứ trong thư mục đầu tiên /wp-content/*và bỏ qua!/wp-content/themes

/*
!/wp-content

/wp-content/*
!/wp-content/themes

Bây giờ các tệp Unracked sẽ tiếp tục thu hẹp chỉ còn wp-content/themes

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/themes/twentyeleven/
        wp-content/themes/twentytwelve/
        ..

Lặp lại quá trình cho đến khi tệp giả đó là tệp duy nhất vẫn hiển thị là Không bị chặn:

/*
!/wp-content

/wp-content/*
!/wp-content/themes

/wp-content/themes/*
!/wp-content/themes/my-theme

$ git status

    Changes to be committed:
        new file:   wp-content/themes/my-theme/index.php
        new file:   wp-content/themes/my-theme/style.css

    Untracked files:
        wp-content/themes/my-theme/DUMMY.TXT

3

Đối với những người tìm kiếm một giải pháp sạch hơn , xin vui lòng thử sau đây.

Như đã đề cập trong các ý kiến ​​về điều này câu trả lời , bạn phải sử dụng phương pháp này một cách đệ quy.

Trong ví dụ này, bạn có một thiết lập trang web tại ./nơi đặt .gitthư mục và .gitignoretệp của bạn và cài đặt cài đặt WordPress ./wordpress. Để bỏ qua chính xác mọi thứ theo./wordpress thư mục ngoài chính thư mục chủ đề ( wordpress/wp-content/themes/my-theme), bạn sẽ phải bỏ qua đệ quy và cho phép mỗi thư mục lên cho đến khi thư mục bạn muốn cho phép:

wordpress/*
wordpress/wp-content/*
wordpress/wp-content/themes/*
!wordpress/wp-content
!wordpress/wp-content/themes
!wordpress/wp-content/themes/my-theme

Lý do bỏ qua với ký tự đại diện và cho phép (hoặc, bỏ qua 'ngoài') chính thư mục cho phép Git nhìn vào bên trong thư mục trước khi bỏ qua mọi thứ bên trong. Sau đó, chúng tôi nói với Git bỏ qua mọi thứ 'ngoài' thư mục chúng tôi đã chỉ định. Đây là cùng một cú pháp nhưng theo thứ tự Git đang xem nó như thế nào:

wordpress/*                            # Ignore everything inside here
!wordpress/wp-content                  # Apart from this directory

wordpress/wp-content/*                 # Ignore everything inside here
!wordpress/wp-content/themes           # Apart from this directory

wordpress/wp-content/themes/*          # Ignore everything inside here
!wordpress/wp-content/themes/my-theme  # Apart from this directory

Hy vọng rằng điều này sẽ giúp ai đó hiểu rõ hơn về sự cần thiết của phương pháp đệ quy.


3

trễ bữa tiệc nhưng đây là những gì tôi sử dụng cho độ sâu không xác định (giải pháp được chấp nhận yêu cầu độ sâu đã biết)

/*
!.gitignore
!wp-content/
!*/

bằng cách này, mọi thứ trong wp-content không bị bỏ qua.


3

Sau khi có nhu cầu này nhiều lần, cuối cùng tôi cũng tìm được giải pháp [1]:

/*/
/*.*
!.git*
!/wordpress

Dòng giải thích theo từng dòng:

  1. Bỏ qua tất cả các thư mụcthư mục gốc.
  2. Bỏ qua tất cả các tệp có phần mở rộng ở thư mục gốc.
  3. Cho phép .gitignorechính nó (và có khả năng .gitattributes).
  4. Cho phép thư mục mong muốn với tất cả các thư mục con

[1] Hạn chế (mà tôi biết):

  1. Nó không bỏ qua các tập tin mà không có phần mở rộng ở gốc (và việc thêm /*sẽ phá vỡ toàn bộ lược đồ).
  2. Thư mục mà bạn muốn đưa vào dòng 4 ( wordpresstrong trường hợp này) không thể có .trong tên (ví dụ: wordpress.1sẽ không hoạt động). Nếu nó có một. , sau đó loại bỏ dòng 2 và tìm một cách khác để loại trừ tất cả các tệp ở gốc.
  3. Chỉ được thử nghiệm trên Windows với git version 2.17.1.windows.2

3

Một giải pháp dễ dàng khác:

Bạn muốn bỏ qua tất cả các tệp Wordpress, nhưng không phải chủ đề của bạn (ví dụ).

.gitignore , nội dung là:

# All wordpress + content of revert ignored directories
wordpress/*
wordpress/wp-content/*
wordpress/wp-content/themes/*

# Revert ignoring directories
!wordpress/
!wordpress/wp-content/
!wordpress/wp-content/themes/
!wordpress/wp-content/themes/my_theme

Trong ví dụ này, bạn có thể xóa wordpress nếu .gitignore nằm trong thư mục root wordpress

Bạn có thể thực hiện chính xác như vậy với mọi thư mục và nội dung bạn muốn "đặc biệt" tránh xa các thư mục / tệp được phân bổ

Phần kết luận :

Hãy chắc chắn bỏ đánh dấu tất cả các thư mục của một đường dẫn mà bạn muốn bỏ dấu

NHƯNG

Hãy chắc chắn bỏ qua tất cả nội dung của các thư mục chưa được đăng ký mà bạn muốn bỏ qua


2

Bạn có thể thử điều này:

!**/themes/*

Ở đâu :

  • ! : phủ nhận bỏ qua (bao gồm)
  • **: bất kỳ cây thư mục (đệ quy) để bạn không phải chỉ định đường dẫn thư mục của mình
  • chủ đề: thư mục của bạn để bao gồm (có thể là bất cứ điều gì)
  • *: bất kỳ tệp nào trong thư mục đó, bạn cũng có thể bao gồm tất cả các thư mục con với ** và thay vì bao gồm bất kỳ tệp nào (*), bạn có thể cụ thể * .css, * .xy

2

Đây là giải pháp của tôi, giả sử thanh toán vào wp-content

# Ignore everything except directories
*
!*/

# except everything in the child theme and its required plugin
!/themes/mytheme-child/**
!/plugins/my-plugin/**

# and this file
!.gitignore

và thử nghiệm:

git version 2.20.1 (Apple Git-117)
$ git check-ignore -v .foo foo foo/ themes/foo themes/foo/bar themes/mytheme-child \
themes/mytheme-child/foo plugins/foo plugins/my-plugin plugins/my-plugin/foo .gitignore
.gitignore:2:*  .foo
.gitignore:2:*  foo
.gitignore:2:*  foo/
.gitignore:2:*  themes/foo
.gitignore:2:*  themes/foo/bar
.gitignore:2:*  themes/mytheme-child
.gitignore:6:!/themes/mytheme-child/**  themes/mytheme-child/foo
.gitignore:2:*  plugins/foo
.gitignore:2:*  plugins/my-plugin
.gitignore:7:!/plugins/my-plugin/** plugins/my-plugin/foo
.gitignore:10:!.gitignore   .gitignore

vì vậy nó chính xác bỏ qua mọi thứ tôi không muốn và không có gì tôi muốn giữ.

Mã phát hành

Gitlab được định cấu hình với các bản sao lưu trữ cho các nhánh được bảo vệ, theo https://docs.gitlab.com/ee/workflow/reposeective_mirroring.html

Khi mã được đẩy đến một nhánh được bảo vệ, nó sẽ được nhân đôi cho các máy chủ dànsản xuất trong /opt/checkout/repo.git/repo trần. Các post-receivehook sau (in /opt/checkout/repo.git/hooks/post-receive) sau đó sẽ kiểm tra mã vào thư mục làm việc.

#!/bin/bash

BRANCH=staging
GIT_DIR=/opt/checkout/repo.git
GIT_WORK_TREE=/opt/bitnami/apps/wordpress/htdocs/wp-content

# on push, checkout the code to the working tree
git checkout -f "${BRANCH}"

# ensure permissions are correct
sudo chown -R bitnami:daemon "${GIT_WORK_TREE}"
sudo chmod -R go-w "${GIT_WORK_TREE}"

Để biết thêm thông tin, hãy xem https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps


1

Đây là cách tôi đã làm:

# Ignore everything at root:
/*

# Except for directories:
!wordpress/(WordPress Site 1)/wp-content/themes/
!wordpress/(WordPress Site 1)/wp-content/themes/
!wordpress/(WordPress Site 1)/wp-content/themes/

# Except files:
!README

#Except files of type:
!*.txt

Đây là những gì làm việc cho tôi. Cho phép bạn bỏ qua mọi thứ trừ các tệp hoặc thư mục cụ thể

macOS sierra


0

Tôi đang ở trong cùng một chiếc thuyền đang cố gắng quản lý một loạt các trang web Wordpress dưới một repo. Cấu trúc thư mục của tôi trông như thế này:

root (git repo)
(WordPress Site 1)/app/public/wp-content/themes
(WordPress Site 2)/app/public/wp-content/themes
(WordPress Site 3)/app/public/wp-content/themes

Tôi muốn chỉ theo dõi các mục trong app/publicthư mục cho mỗi trang web. Tôi đã thử các mẫu trong trang này cũng như một số gợi ý ở đây và cuối cùng đã thử:

/(WordPress Site 1)/*
!(WordPress Site 1)/app
(WordPress Site 1)/app/*
!(WordPress Site 1)/app/public

đã hoạt động nhưng tôi sẽ phải bỏ qua cùng một đường dẫn cho mỗi trang web mà tôi đang cố gắng tránh.

Sau đó, tôi chỉ thay thế tên của trang web *và điều đó đã giúp tôi. Vì vậy, đây là những gì tôi đã kết thúc bằng cách sử dụng:

/*/*
!*/app
*/app/*
!*/app/public

Điều này thực sự bỏ qua mọi thứ trong thư mục của trang web trong khi chụp mọi thứ trong app/public thư mục cho bất kỳ trang web nào tôi tạo trong thư mục gốc.

Lưu ý rằng nó sẽ không bỏ qua các tập tin trong thư mục gốc, chỉ thư mục :)

Hi vọng điêu nay co ich.


0

Đây là tệp duy nhất bị bỏ qua trong hầu hết các trường hợp, bởi vì bạn có wp-config-sample.php mà bạn có thể chia sẻ nó với người khác.

/wp-config.php
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.