Menggunakan .gitignore untuk mengabaikan semuanya kecuali direktori tertentu

149

Masalah saya adalah saya memiliki banyak situs WordPress di repo git saya, di mana saya hanya ingin memasukkan konten themesfolder saya secara selektif , sambil mengabaikan sisa file redundan yang ditemukan di WordPress.

Saya telah menggunakan file .gitignore untuk mengabaikan jenis file sebelumnya, tetapi bisakah itu digunakan sebaliknya- yaitu mengabaikan semuanya TETAPI jalur folder tertentu?

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

Terima kasih-

MEMPERBARUI:

Berdasarkan jawaban yang saya lakukan berikut ini, tetapi tidak berhasil. Ada ide?

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

Saya juga mencoba variasi berikut:

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

Tak satu pun dari ini membaca themesfolder saya .

Yarin
sumber

Jawaban:

137

Begini cara saya melakukannya - pada dasarnya Anda harus berjalan di atas jalur, Anda tidak dapat menggunakan wildcard lebih dari satu level ke segala arah:

# 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/*/*/*/*/*

Perhatikan bagaimana Anda harus secara eksplisit mengizinkan konten untuk setiap level yang ingin Anda sertakan. Jadi jika saya memiliki subdirektori 5 jauh di bawah tema, saya masih perlu menjelaskannya.

Ini hanya cara kerjanya untuk saya. Jika seseorang peduli untuk menawarkan penjelasan yang lebih tepat dengan segala cara.

Juga, jawaban ini berguna:
how-do-negated-patterns-work-in-gitignore
how-do-gitignore-exclusion-rules-really-work


CATATAN: Saya mencoba menggunakan 'gumpalan' wildcard ganda tetapi menurut ini fungsionalitas itu bergantung pada sistem dan tidak berfungsi di mac saya:

Tidak bekerja:

!**/wp-content/themes/
!**/wp-content/themes/**
Yarin
sumber
4
sebelum git 1.8.4, karakter **pengganti hanya berfungsi jika Anda tidak memiliki garis miring dalam pola Anda, lihat sparethought.wordpress.com/2011/07/19/…
Ini seharusnya berhasil:!/wordpress/*/wp-content/themes/**/*
that0n3guy
1
Apakah sintaks ini berfungsi di windows? Sepertinya tidak berhasil untuk saya ...
ScottF
Ia bekerja keajaiban pada Windows 10. Menggunakannya untuk semua jenis proyek kustom dari Visual Studio Code.
klewis
Saya menggunakan kombinasi jawaban ini dan yang disediakan oleh @ 吴毅 凡, yang berhasil untuk saya.
MikeyE
99

Saya mencoba cara di atas dan tidak berhasil dengan baik. Pendekatan yang lebih baik adalah sebagai berikut dari sini: 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/
dwenaus
sumber
1
@ dwenaus- terima kasih telah membagikan ini- terlihat berguna untuk repo yang di-root pada direktori wordpress tertentu, tetapi tidak akan berfungsi pada repo di beberapa situs wordpress di bawahnya, itulah tujuan saya ..
Yarin
Struktur / model ini sangat membantu. Saya menginginkan satu repo untuk pemasangan Magento / WP gabungan, dan dengan kurang dari 30 baris .gitignore menggunakan teknik ini, saya bisa mempersempitnya menjadi hanya file tema / skin Magento dan file tema WP. Terima kasih!
random_user_name
jangan gunakan penyiapan ini dengan penerapan otomatis karena pengguna git pemula dapat mengacaukan file di luar area berlekuk (mis. jika mereka menghapus semua file di repo secara tidak sengaja dan itu diterapkan secara otomatis, itu akan menjadi berantakan). Selain itu, ini bekerja dengan baik.
dwenaus
Anda pria pria! Apalagi jika versi Anda> = 2.1.4. Ref: git-scm.com/docs/gitignore/2.1.4
Haktan Suren
32

ubah baris pertama

*

ubah menjadi

/*
吴毅 凡
sumber
2
Ini bekerja untuk saya. File .gitignore saya seperti ini / *! .Gitignore! / Vendor
umbalaconmeogia
13

Coba jawaban ini:

Jadikan .gitignore mengabaikan semuanya kecuali beberapa file

# Ignore everything
*

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

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

Bagaimana cara memberitahu Git untuk mengabaikan semuanya kecuali subdirektori?

Ini mengabaikan file root & direktori root, kemudian membatalkan pengabaian direktori root bin:

/*
/*/
!/bin/

Dengan cara ini Anda mendapatkan semua direktori bin, termasuk subdirektori dan filenya.

mengganggu
sumber
@ jengkel- Terima kasih, tidak melihat ini- namun, saya kesulitan menerapkannya pada situasi saya. Lihat suntingan saya di atas ...
Yarin
1
Tautan kedua yang saya posting mengatakan bahwa Anda akan membutuhkan keduanya !*/wp-content/themes/dan !*/wp-content/themes/*. Sudahkah Anda mencoba variasi itu? Selain itu, sebagai alternatif, Anda bisa menggunakan !*/wp-content/themes/dan di setiap direktori tema memiliki file .gitignore sendiri dengan!*
iritasi
1
@ jengkel- tidak variasi itu juga tidak berhasil, dan bagaimanapun saya tidak melihat bagaimana itu akan berbeda dari!*/wp-content/themes*
Yarin
9

Jika Anda memberi awalan pola dengan tanda seru ( !) itu meniadakan pola sebelumnya yang mengecualikannya. Jadi, mungkin, Anda dapat mengabaikan semuanya, lalu hanya mengizinkan apa yang Anda inginkan dengan menggunakan pola ini.

dappawit
sumber
@ dappawit- Terima kasih- konsep masuk akal, dan saya membuatnya berfungsi untuk file, tetapi tidak untuk folder tema saya- lihat hasil edit saya di atas ...
Yarin
Saya bukan ahli pola gumpal, tapi membaca halaman manual Gitignore, saya percaya ini dapat bekerja: !wordpress/[write out directories]/wp-content/themes/. Perhatikan garis miring penutup dan tidak ada tanda bintang penutup. Perhatikan juga bahwa *hanya akan cocok dengan satu level, bukan beberapa direktori. Ini adalah halaman manualnya: kernel.org/pub/software/scm/git/docs/gitignore.html
dappawit
Membantu saya menyadari bahwa saya harus meletakkan negasi setelah aturan lain terima kasih
Ax
6

Katakanlah Anda memiliki struktur direktori seperti ini:

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

Jika Anda hanya ingin mengizinkan situs / semua / file / privat / kertas koran dan situs / default / file / privat / kertas koran , pertama-tama Anda dapat mencoba ini:

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

Ini salah! Hal yang rumit dengan gitignore adalah Anda harus terlebih dahulu mengizinkan direktori induk ("private") untuk dimasukkan , sebelum Anda dapat mengizinkan direktori turunannya ("kertas koran") untuk disertakan dalam komit.

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

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

Peeter Kokk
sumber
1
"Anda harus mengizinkan direktori induk untuk disertakan, sebelum Anda dapat mengizinkan direktori anaknya" - Terima kasih telah menunjukkan hal ini! Justru masalah saya.
Jet Blue
6

Saya perlu mengabaikan semuanya kecuali satu folder dengan subdirektori.

Bagi saya, ini berhasil

# Ignore everything
/*

# Not these directories
!folder/

# Not these files
!.gitignore
!.env
!file.txt
Matias Seguel
sumber
5

Saya selalu terjebak di suatu tempat dalam hal ini bahkan setelah kembali ke pertanyaan ini berkali-kali. Saya telah menemukan proses mendetail untuk melakukannya selangkah demi selangkah:

Pertama gunakan saja git adduntuk menambahkan konten yang sebenarnya.

Ini akan menampilkan file relevan yang ditambahkan ke indeks sementara yang lainnya masih belum terlacak. Ini membantu menyusun .gitignorelangkah demi langkah.

$ 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/
        ...

Tambahkan DUMMY.TXTfile sementara di direktori Anda:

$ 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/
        ...

Tujuan kami sekarang adalah untuk membuat aturan sedemikian rupa sehingga ini DUMMY.TXTmenjadi satu-satunya yang masih muncul sebagai Tidak dilacak ketika kami selesai.

Mulai tambahkan aturan:

.gitignore

/*

Yang pertama adalah mengabaikan segalanya. Semua file yang tidak dilacak akan hilang, hanya file yang diindeks yang akan ditampilkan:

$ git status

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

Tambahkan dir pertama di jalur wp-content

/*
!/wp-content

Sekarang file yang tidak dilacak akan muncul lagi, tetapi hanya ada wp-contentisinya

$ 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/
        ..

Abaikan semua yang ada di dir pertama /wp-content/*dan hapus abaikan!/wp-content/themes

/*
!/wp-content

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

Sekarang file yang tidak dilacak akan lebih mempersempit menjadi hanya 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/
        ..

Ulangi proses tersebut sampai file dummy itu adalah satu-satunya yang masih ditampilkan sebagai Tidak dilacak:

/*
!/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
refleks tertinggal
sumber
4

Jawaban Yarin berhasil untuk saya, ini versi saya (saya tidak memerlukan /wordpresssub-direktori):

*

!.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
cabgfx.dll
sumber
4

Setelah membutuhkan ini beberapa kali, saya akhirnya menemukan solusi [1]:

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

Penjelasan baris demi baris:

  1. Abaikan semua direktori di root.
  2. Abaikan semua file dengan ekstensi di root.
  3. Izinkan .gitignoredirinya sendiri (dan berpotensi .gitattributes).
  4. Izinkan direktori yang diinginkan dengan semua subdirektori

[1] Batasan (yang saya ketahui):

  1. Itu tidak mengabaikan file tanpa ekstensi di root (dan menambahkan /*akan merusak seluruh skema).
  2. Direktori yang ingin Anda masukkan pada baris 4 ( wordpressdalam hal ini) tidak boleh ada .dalam namanya (misalnya wordpress.1tidak akan berfungsi). Jika memang memiliki ., maka hapus baris 2 dan temukan cara lain untuk mengecualikan semua file di root.
  3. Diuji hanya di Windows dengan git version 2.17.1.windows.2
Dimagog
sumber
3

Bagi mereka yang mencari pembersih solusi yang , silakan coba yang berikut ini.

Seperti yang disebutkan dalam komentar ini jawaban , Anda harus menggunakan metode ini secara rekursif.

Dalam contoh ini, Anda memiliki pengaturan situs web di ./mana .gitfolder dan .gitignorefile Anda berada dan pengaturan instalasi WordPress ./wordpress. Untuk mengabaikan semua yang ada di bawah ./wordpressdirektori dengan benar selain dari direktori tema itu sendiri ( wordpress/wp-content/themes/my-theme), Anda harus mengabaikan dan mengizinkan setiap direktori secara rekursif hingga direktori yang ingin Anda izinkan:

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

Alasan mengabaikan dengan karakter pengganti dan mengizinkan (atau, mengabaikan 'selain') direktori itu sendiri memungkinkan Git untuk melihat ke dalam direktori terlebih dahulu sebelum mengabaikan semua yang ada di dalamnya. Kami kemudian memberi tahu Git untuk mengabaikan semua yang 'selain' direktori yang telah kami tentukan. Berikut sintaks yang sama tetapi dalam urutan bagaimana Git melihatnya:

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

Semoga ini membantu seseorang lebih memahami perlunya metode rekursif.

Oliver Tappin
sumber
3

terlambat ke pesta tetapi inilah yang saya gunakan untuk kedalaman yang tidak diketahui (solusi yang diterima membutuhkan kedalaman yang diketahui)

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

dengan cara ini semua yang ada di dalam wp-content tidak diabaikan.

Jubair
sumber
3

Solusi mudah lainnya:

Anda ingin mengabaikan semua file Wordpress, tetapi bukan tema Anda (misalnya).

.gitignore , kontennya adalah:

# 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

Dalam contoh ini, Anda dapat menghapus wordpress jika .gitignore ada di direktori root wordpress

Anda dapat melakukan hal yang sama pada setiap folder dan konten yang ingin Anda "sangat" dijauhkan dari folder / file gitignored

Kesimpulan:

Pastikan untuk tidak mengabaikan semua direktori jalur yang ingin Anda abaikan

TAPI

Pastikan untuk mengabaikan semua konten direktori yang tidak diabaikan yang ingin Anda abaikan

Arthur Bouchard
sumber
2

Anda bisa mencoba ini:

!**/themes/*

Dimana :

  • !: negate ignore (include)
  • **: pohon direktori (rekursi) apa pun sehingga Anda tidak perlu menentukan jalur folder Anda
  • tema: folder Anda untuk dimasukkan (bisa apa saja)
  • *: file apa pun di folder itu, Anda juga dapat menyertakan semua subfolder dengan ** dan alih-alih menyertakan file apa pun (*), Anda dapat memilih * .css, * .xy
Utama
sumber
2

Inilah solusi saya, yang mengasumsikan pembayaran ke 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

dan pengujian:

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

jadi dengan benar mengabaikan semua yang tidak saya inginkan dan tidak ada yang ingin saya simpan.

Merilis Kode

Gitlab dikonfigurasi dengan cermin repositori untuk cabang yang dilindungi, menurut https://docs.gitlab.com/ee/workflow/repository_mirroring.html

Ketika kode didorong ke cabang yang dilindungi, itu akan dicerminkan ke server pementasan dan produksi dalam /opt/checkout/repo.git/repo telanjang. post-receiveHook berikut (in /opt/checkout/repo.git/hooks/post-receive) kemudian akan melakukan checkout kode ke direktori kerja.

#!/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}"

Untuk informasi lebih lanjut, lihat https://www.digitalocean.com/community/tutorials/how-to-set-up-automatic-deployment-with-git-with-a-vps

Waddles
sumber
1

Inilah cara saya melakukannya:

# 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

Inilah yang berhasil bagi saya. Memungkinkan Anda mengabaikan semuanya kecuali file atau folder tertentu

macOS sierra

Gaurav Raghuvanshy
sumber
0

Saya berada di perahu yang sama mencoba mengelola banyak situs Wordpress di bawah satu repo. Struktur direktori saya terlihat seperti ini:

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

Saya hanya ingin melacak item di dalam app/publicfolder untuk setiap situs. Saya mencoba contoh di halaman ini serta beberapa saran di sini dan akhirnya mencoba ini:

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

yang berhasil tetapi saya harus mengabaikan jalur yang sama untuk setiap situs yang saya coba hindari.

Kemudian saya hanya mengganti nama situs dengan *dan itu berhasil bagi saya. Jadi inilah yang akhirnya saya gunakan:

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

Ini secara efektif mengabaikan semua yang ada di folder situs sambil menangkap semua yang ada di app/publicfolder untuk situs apa pun yang saya buat di root.

Perhatikan bahwa itu tidak akan mengabaikan file di root, hanya direktori :)

Semoga ini membantu.

Henry
sumber
-1

Ini adalah satu-satunya file yang diabaikan dalam banyak kasus, karena Anda memiliki wp-config-sample.php yang dapat Anda bagikan dengan orang lain.

/wp-config.php
Jaskaran Singh
sumber