SVN: Apakah ada cara untuk menandai file sebagai "jangan komit"?


153

Dengan TortoiseSVN, saya bisa memindahkan file ke daftar perubahan abaikan-komit, sehingga ketika saya komit seluruh pohon, perubahan pada file itu tidak dapat dilakukan.

Apakah ada cara untuk melakukan sesuatu seperti itu menggunakan alat baris perintah svn?

EDIT: Terima kasih atas saran yang digunakan svn:ignore, tetapi itu tidak cukup apa yang saya cari.

svn:ignorememengaruhi hal-hal seperti svn add& svn import. Ini memberikan daftar pola nama file untuk diabaikan.

Saya memiliki file yang sudah di bawah kendali sumber, tetapi saya ingin membuat perubahan sementara pada file itu yang saya tidak ingin komit nanti ketika saya mengkomit seluruh pohon sumber. Saya membuat banyak perubahan lain dan saya bisa menempel catatan di monitor saya mengatakan kepada saya untuk mengembalikan file itu sebelum saya komit pohon, tapi alangkah baiknya jika svn bisa secara otomatis melewati file itu.


1
Ada cara menggunakan cabang pribadi dan beralih status. [Lihat posting saya yang lain tentang hal ini.] [1] [1]: stackoverflow.com/questions/862950/…
ptitpion

Jawaban:


120

Subversion tidak memiliki fitur "tidak berkomitmen" / "abaikan komitmen" bawaan, pada Februari 2016 / versi 1.9. Jawaban ini adalah solusi baris perintah yang tidak ideal

Seperti yang dinyatakan OP, TortoiseSVN memiliki daftar perubahan bawaan, "ign-on-commit", yang secara otomatis dikecualikan dari komit. Klien baris perintah tidak memiliki ini, jadi Anda perlu menggunakan beberapa daftar perubahan untuk mencapai perilaku yang sama (dengan peringatan) :

  • satu untuk pekerjaan yang ingin Anda komit [pekerjaan]
  • satu untuk hal-hal yang ingin Anda abaikan [abaikan-komit]

Karena ada preseden dengan TortoiseSVN, saya menggunakan "abaikan-komit" dalam contoh saya untuk file yang tidak ingin saya komit. Saya akan menggunakan "kantor" untuk file yang saya lakukan, tetapi Anda dapat memilih nama yang Anda inginkan.

Pertama, tambahkan semua file ke daftar perubahan bernama "work". Ini harus dijalankan dari akar copy pekerjaan Anda:

svn cl work . -R

Ini akan menambahkan semua file dalam copy pekerjaan secara rekursif ke daftar perubahan bernama "work". Ada kelemahan untuk ini - karena file baru ditambahkan ke copy pekerjaan, Anda harus secara khusus menambahkan file baru atau mereka tidak akan disertakan. Kedua, jika Anda harus menjalankan ini lagi, Anda perlu menambahkan kembali semua file "abaikan-komit" Anda lagi. Tidak ideal - Anda dapat mulai memelihara daftar 'abaikan' Anda sendiri dalam file seperti yang dilakukan orang lain.

Kemudian, untuk file yang ingin Anda kecualikan:

svn cl ignore-on-commit path\to\file-to-ignore

Karena file hanya dapat berada dalam satu daftar perubahan, menjalankan penambahan ini setelah penambahan "work" Anda sebelumnya akan menghapus file yang ingin Anda abaikan dari daftar perubahan "work" dan memasukkannya ke daftar perubahan "abaikan komitmen".

Saat Anda siap untuk mengkomit file yang dimodifikasi yang ingin Anda komit, Anda kemudian cukup menambahkan "--cl work" ke komit Anda:

svn commit --cl work -m "message"

Inilah contoh sederhana di komputer saya:

D:\workspace\trunk>svn cl work . -R
Skipped '.'
Skipped 'src'
Skipped 'src\conf'
A [work] src\conf\db.properties
Skipped 'src\java'
Skipped 'src\java\com'
Skipped 'src\java\com\corp'
Skipped 'src\java\com\corp\sample'
A [work] src\java\com\corp\sample\Main.java
Skipped 'src\java\com\corp\sample\controller'
A [work] src\java\com\corp\sample\controller\Controller.java
Skipped 'src\java\com\corp\sample\model'
A [work] src\java\com\corp\sample\model\Model.java
Skipped 'src\java\com\corp\sample\view'
A [work] src\java\com\corp\sample\view\View.java
Skipped 'src\resource'
A [work] src\resource\icon.ico
Skipped 'src\test'

D:\workspace\trunk>svn cl ignore-on-commit src\conf\db.properties
D [work] src\conf\db.properties
A [ignore-on-commit] src\conf\db.properties

D:\workspace\trunk>svn status

--- Changelist 'work':
        src\java\com\corp\sample\Main.java
        src\java\com\corp\sample\controller\Controller.java
        src\java\com\corp\sample\model\Model.java
M       src\java\com\corp\sample\view\View.java
        src\resource\icon.ico

--- Changelist 'ignore-on-commit':
M       src\conf\db.properties

D:\workspace\trunk>svn commit --cl work -m "fixed refresh issue"
Sending        src\java\com\corp\sample\view\View.java
Transmitting file data .done
Committing transaction...
Committed revision 9.

Alternatifnya adalah dengan menambahkan setiap file yang ingin Anda komit ke daftar perubahan 'pekerjaan', dan bahkan tidak mempertahankan daftar abaikan, tetapi ini juga banyak pekerjaan. Sungguh, satu-satunya solusi ideal yang sederhana adalah jika / ketika ini diimplementasikan dalam SVN itu sendiri. Ada masalah lama tentang ini di pelacak masalah Subversion, SVN-2858 , jika terjadi perubahan di masa depan.


1
Saya telah menambahkan dua file dengan perintah yang telah Anda sebutkan: $svn st --- Changelist 'ignore-on-commit': M database.php M config.php dan masih, mereka telah dikirim ke repo on commit. Ada yang tahu apa yang saya lakukan salah?
Attila Fulop

7
Menambahkan file ke daftar perubahan 'abaikan saat berkomitmen' tidak dengan sendirinya mencegah file dari komitmen. TortoiseSVN (klien Windows GUI) telah dibangun sehubungan dengan "abaikan-komit", tetapi baris perintah svn tidak. Satu-satunya saran yang saya miliki dalam jawaban asli saya adalah menambahkan file yang ingin Anda komit ke daftar perubahan, dan kirim untuk melakukan itu
Joshua McKinnon

7
ign-on-commit adalah daftar yang dilindungi Tortoise. Semua yang dilakukannya adalah mencegah item diperiksa di GUI secara default, jadi ini adalah fitur spesifik Tortoise GUI. Anda tidak perlu menggunakan baris perintah untuk menambah daftar jika Anda menggunakan GUI. Hanya menu konteks pada item daftar komit dan di bagian bawah Anda dapat memindahkannya ke daftar perubahan dan abaikan-komit sudah ditentukan. tortoisesvn.net/docs/release/TortoiseSVN_en/…
tjmoore

ini tidak melakukan jack. itu melakukan segalanya.
ahnbizcad

Tidak berfungsi, pertanyaan khusus diajukan tentang solusi baris perintah, bukan GUI.
riv

26

Aku sudah secara konsisten menemukan diri dalam situasi ini juga: dan daftar perubahan tidak bekerja untuk saya - saya ingin membuat daftar pendek file yang saya tidak ingin berkomitmen, daripada mempertahankan daftar besar file yang saya lakukan inginkan untuk melakukan!

Saya bekerja di command-line linux: jadi solusi saya adalah membuat skrip / usr / bin / svnn (ya, dengan dua 'n!) Sebagai berikut:

#! /bin/bash
DIR=/home/mike/dev/trunk

IGNORE_FILES="\
        foo/pom.xml \
        foo/src/gwt/App.gwt.xml \
        foo/src/main/java/gwt/Common.gwt.xml \
        foo/src/main/resources/context/datasource/local.xml \
        foo/src/main/resources/context/environment/local.xml"

for i in $IGNORE_FILES; do mv $DIR/$i $DIR/"$i"_; done;

svn "$@"

for i in $IGNORE_FILES; do mv $DIR/"$i"_ $DIR/$i; done;

Jelas, ini disesuaikan dengan situasi saya - tetapi ubah saja DIR dan IGNORE_FILES agar sesuai dengan pengaturan dev Anda. Ingat untuk mengubah skrip menjadi executable dengan:

sudo chmod +x /usr/bin/svnn

..kemudian Anda hanya menggunakan "svnn" alih-alih "svn" untuk menjalankan subversi tanpa takut memeriksa perubahan lokal pada file pada daftar IGNORE_FILES. Saya harap ini membantu!


Akhirnya, jawaban ini sebenarnya benar. Anda perlu menulis beberapa alat. Ini sebenarnya tidak sempurna, karena saya ingin memiliki opsi dinamis, seperti svnn ignore configs/*- dengan wildcard, dan bel dan peluit. Saya rasa saya menulis sesuatu seperti itu sendiri, dan kemudian kembali ke sini!
Tomasz Gandor

ini bagus! Lebih baik lagi, buat alias di .bashrc untuk svn -> svnn. Bahkan lebih baik, daripada menentukan file untuk diabaikan di dalam perintah, itu bisa berperilaku seperti git, itu akan memeriksa file .ignore di dalam folder dan mengabaikan setiap file yang cocok dengan pola.
Tarek

Daripada mempelajari kembali mengetik svnn, pertimbangkan untuk memanggilnya svndan menempatkan skrip ini di sesuatu yang bisa di awal PATH Anda, seperti ${HOME}/bin. Dari skrip itu sendiri, Anda akan menelepon /usr/bin/svn.
Joost

17

Saya tidak percaya ada cara untuk mengabaikan file di repositori. Kami sering mengalami hal ini dengan web.config dan file konfigurasi lainnya.

Meskipun tidak sempurna, solusi yang paling sering saya lihat dan gunakan adalah memiliki file .default dan tugas yang diperlukan untuk membuat salinan lokal.

Sebagai contoh, dalam repo adalah file bernama web.config.defaultyang memiliki nilai default. Kemudian buat tugas lama yang akan mengganti nama semua web.config.defaultfile web.configyang kemudian dapat disesuaikan dengan nilai-nilai lokal. Tugas ini harus dipanggil ketika copy pekerjaan baru diambil atau build dijalankan.

Anda juga harus mengabaikan web.configfile yang dibuat agar tidak dikomit ke repositori.


8

Lihat daftar perubahan , yang dapat memberi Anda opsi untuk memfilter file yang telah Anda ubah tetapi tidak ingin melakukan. SVN tidak akan secara otomatis melewatkan file kecuali Anda menyuruhnya - dan cara Anda mengatakannya bahwa file ini berbeda dengan file lain adalah dengan meletakkannya di daftar perubahan.

Memang membutuhkan lebih banyak pekerjaan untuk Anda, dan Anda hanya dapat menerapkan daftar perubahan ke copy pekerjaan Anda (jelas, bayangkan kekacauan yang dapat terjadi jika Anda bisa menerapkan properti 'tidak pernah diperbarui' ke revisi!).


1
Tapi itulah yang kami inginkan. Misalnya, file sumber yang Anda perlukan untuk mengatur defaultUserId = yourId, dan bukannya standar sistem.
orbfish

4

Saya datang ke utas ini mencari cara untuk membuat komit "atom" hanya dari beberapa file dan alih-alih mengabaikan beberapa file pada komit saya pergi ke arah lain dan hanya mengkomit file yang saya inginkan:

svn ci filename1 filename2

Mungkin, itu akan membantu seseorang.


Jawaban Anda hanya satu saran yang memadai di utas ini. svn cihanya alias untuk svn commit. Komit komit memungkinkan untuk membuat komit tertentu dari file yang ditentukan
oxfn

3

Kawan, saya baru menemukan solusi. Mengingat bahwa TortoiseSVN bekerja seperti yang kita inginkan, saya mencoba menginstalnya di Linux - yang berarti, berjalan di Wine. Anehnya itu bekerja! Yang harus Anda lakukan adalah:

  1. Tambahkan file yang ingin Anda lewati komit dengan menjalankan: "svn daftar perubahan 'abaikan-komit'".
  2. Gunakan TortoiseSVN untuk melakukan: "~ / .wine / drive_c / Program \ Files / TortoiseSVN / bin / TortoiseProc.exe / command: commit / path: '
  3. File yang dikecualikan akan tidak dicentang untuk komit secara default, sedangkan file yang dimodifikasi lainnya akan diperiksa. Ini persis sama dengan di bawah Windows. Nikmati!

(Alasan mengapa perlu mengecualikan file oleh CLI adalah karena entri menu untuk melakukan itu tidak ditemukan, tidak yakin mengapa. Bagaimanapun, ini bekerja dengan baik!)


2

File konflik tidak diizinkan untuk dikomit. Anda bisa memanfaatkan ini untuk menjaga perubahan pribadi Anda dari repositori. Ini berfungsi baik dengan sejumlah kecil file.

Untuk mendapatkan konflik a-file, copy pekerjaan Anda (WC) tidak memiliki pembaruan a-filedari repositori, dan bahwa a-filedi WC Anda memiliki perubahan yang berada di lokasi yang sama dengan perubahan dalam repositori (perubahan yang Anda tidak perbarui belum). Jika Anda tidak ingin menunggu kondisi di atas, Anda dapat membuat konflik a-fileseperti ini:
Di copy pekerjaan 1 (WC1), tambahkan baris teks ke atas a-file, seperti "buat konflik di sini" . Gunakan sintaks yang diperlukan agar Anda tidak merusak repositori. Berkomitmen a-filedari WC1. Di WC2, tambahkan baris teks yang berbeda ke atas a-file, seperti "saya ingin konflik" . Perbarui dari WC2, dan sekarang file-harus dalam konflik.


1

Saya lebih suka menulis skrip bash pembantu yang berjalan svn commitdi semua file yang Anda butuhkan dan tidak ada yang tidak. Dengan cara ini Anda memiliki lebih banyak kendali.

Misalnya, dengan satu baris, Anda dapat mengkomit semua file dengan ekstensi .hdan .cppyang Anda buat perubahan (dan yang tidak menyebabkan konflik):

svn commit -m "" `svn status | grep "^M.*[h|cpp]$" | awk '{print $2}' | tr "\\n" " "`

Ubah / tambahkan ekstensi ke [h|cpp]bagian. Tambahkan pesan log di antara tanda kutip -m ""jika diperlukan.


1

Beberapa ide yang diusulkan dapat diimplementasikan seperti ini:

Di Windows di PowerShell

tambahkan semua ke list.ps1 default

dir -Recurse | ? { -not $_.PSIsContainer } | % { svn cl default $_.FullName }

tambahkan ke abaikan list.ps1

 dir file1 ... filN  % { $_.FullName } > ignore-on-commit
 cat .\ignore-on-commit | % { svn cl ignore-on-commit $_ }
 svn add ignore-on-commit

Sekarang, Anda dapat alias svn ci --changelist defaultsehingga Anda tidak perlu menentukannya setiap kali. Manfaat tambahan adalah Anda dapat menyimpan daftar abaikan saat berkomitmen (jika Anda mau) di repositori.

Saya melakukan ini untuk beberapa file yang terus diperbarui tetapi jarang benar-benar berubah dengan tangan. Misalnya saya menambahkan nomor revisi ke file konfigurasi saya pada placeholder tertentu sehingga file diubah pada setiap komit, namun perubahan manual jarang terjadi.


1

Saya bosan menunggu ini dibangun di SVN. Saya menggunakan tortoiseSVN dengan abaikan-komit, tapi itu muncul kotak dialog pengguna yang Anda tidak bisa menekan dari baris perintah, dan ketika saya menjalankan skrip build saya dan pergi dan membuat secangkir teh, saya benci ketika Saya kembali untuk mengetahui sedang menunggu input pengguna 10% dari keseluruhan.

Jadi, inilah skrip Windows PowerShell yang hanya melakukan file yang tidak ada dalam daftar perubahan:

# get list of changed files into targets
[XML]$svnStatus = svn st -q --xml C:\SourceCode\Monad
# select the nodes that aren't in a changelist
$fileList = $svnStatus.SelectNodes('/status/target/entry[wc-status/@item != "unversioned"]') | Foreach-Object {$_.path};
# create a temp file of targets
$fileListPath =  [IO.Path]::GetTempFileName();
$fileList | out-file $fileListPath -Encoding ASCII
# do the commit
svn commit --targets $fileListPath -m "Publish $version" --keep-changelists 
# remove the temp file
Remove-Item $filelistPath

1

Pembaruan skrip user88044.

Idenya adalah untuk mendorong file di daftar perubahan jangan-komit dan menjalankan skrip jahat.

Skrip mengekstrak file jangan-jangan-komit dari perintah: svn status - daftar perubahan 'jangan-jangan-komitmen'

#! / bin / bash DIR = "$ (pwd)"

IGNORE_FILES = "$ (svn status --pengganti daftar 'jangan-jangan-komit' | ekor -n +3 | grep -oE '[^] + $')"

untuk saya dalam $ IGNORE_FILES; lakukan mv $ DIR / $ i $ DIR / "$ i" _; dilakukan;

svn "$ @";

untuk saya dalam $ IGNORE_FILES; lakukan mv $ DIR / "$ i" _ $ DIR / $ i; dilakukan;

Script ditempatkan di / usr / bin / svnn (sudo chmod + x / usr / bin / svnn)

status svnn, svnn commit, dll ...


1

Anda dapat mengonfigurasi daftar perubahan "abaikan-komitmen" langsung dengan TortoiseSVN. Tidak perlu mengkonfigurasi daftar perubahan lain termasuk semua file lainnya

1) Klik "Komitmen SVN ..." (kami tidak akan melakukan, hanya cara untuk menemukan menu grafis untuk daftar perubahan) 2) Pada daftar Klik kanan pada file yang ingin Anda kecualikan. 3) Menu: pindah ke daftar perubahan> abaikan-komit

Lain kali Anda melakukan SVN Commit ... File akan muncul tidak dicentang di akhir daftar, di bawah kategori abaikan-komit.

Diuji dengan: TortoiseSVN 1.8.7, Build 25475 - 64 Bit, 2014/05/05 20:52:12, Subversion 1.8.9, -release


1
youps, saya baru saja melihat komentar tjmoore, sudah memberikan info yang baik untuk pengguna tortoiseSVN ... tidak ada baris perintah tortoisesvn.net/docs/release/TortoiseSVN_en/…
luney

Apakah ini rusak di 1,9?
Jake Hm

1

Ini sudah terlambat untuk permainan, tetapi saya menemukan perintah baris perintah yang paling mengagumkan untuk masalah ini. Selesai menggunakan bash. Nikmati.

svn status | grep -v excluding | sed 's/^A */"/g; s/$/"/g' | tr '\n' ' ' | xargs svn commit -m "My Message"

Ok, jadi inilah penjelasan dari perintahnya. Beberapa hal perlu diubah berdasarkan kasus penggunaan Anda.

svn status

Saya mendapatkan daftar semua file. Mereka semua akan mulai dengan karakter status tersebut (?,!, A, dll). Masing-masing berada di jalurnya sendiri

grep -v excluding

Saya menggunakan grep untuk memfilter daftar. Ini dapat digunakan secara normal (untuk memasukkan) atau dengan flag -v (untuk mengecualikan). Dalam hal ini, ini digunakan untuk mengecualikan, dengan frasa "mengecualikan" menjadi apa yang akan dikecualikan.

sed 's/^. */"/g; s/$/"/g'

Sekarang saya menghapus karakter status dan spasi putih di awal setiap baris, dan kemudian mengutip setiap baris, menggunakan sed. Beberapa nama file saya memiliki spasi di dalamnya, karenanya kutipan.

tr '\n' ' '

Dengan menggunakan tr, saya mengganti semua baris baru dengan spasi. Sekarang seluruh daftar file yang saya komit ada dalam satu baris.

xargs svn commit -m "My Message"

Terakhir, saya menggunakan xargs untuk menjalankan perintah komit saya dengan pesan. Itu melakukan komit, dan menjatuhkan daftar file yang saya kutip sebagai argumen terakhir.

Hasilnya adalah semuanya pada akhirnya bekerja seperti yang saya inginkan. Aku masih agak benci karena memaksaku melompati lingkaran-lingkaran sialan ini, tetapi aku bisa hidup dengan ini. Saya kira.


0

Ketika saya menghadapi masalah yang sama persis, dan Google saya terus memberi saya apa-apa, saya pikir saya menemukan solusi. Inilah yang saya lakukan, sepertinya berfungsi untuk saya, tetapi karena saya terjebak dengan versi SVN lama (<1,5, karena tidak memiliki opsi --ke-lokal) dan saya bukan ahli dalam hal itu Saya tidak yakin ini solusi universal. Jika berhasil juga untuk Anda, beri tahu saya!

Saya berurusan dengan instalasi Prestashop yang saya dapatkan dari SVN, karena orang lain sudah mulai mengerjakannya. Karena pengaturan DB dilakukan untuk server lain, saya mengubahnya di beberapa file di folder / config. Karena folder ini sudah diversi, pengaturannya di svn: diabaikan tidak akan mencegah modifikasi lokal saya di dalamnya dilakukan. Inilah yang saya lakukan:

cp config ../cfg_bkp              # copy the files out of the repo
svn rm config                     # delete files both from svn and "physically"
svn propset svn:ignore "config" . # as the files no longer exists, I can add my ignore rule and then...
mv ../cfg_bkp config              # ...bring'em back
svn revert --recursive config     # make svn forget any existing status for the files (they won't be up for deletion anymore)

Sekarang saya bisa menjalankan svn add --force. di root repo tanpa menambahkan konfigurasi saya, bahkan jika itu tidak cocok dengan versi repo (saya kira saya harus melalui semua ini lagi jika saya memodifikasinya sekali lagi, tidak menguji). Saya dapat svn memperbarui juga tanpa file saya ditimpa atau mendapatkan kesalahan.


0

Solusi yang tidak mengabaikan perubahan dalam properti direktori

Saya mencoba menggunakan solusi berdasarkan changelist, tapi saya punya beberapa masalah dengannya. Pertama, repositori saya memiliki ribuan file, sehingga daftar perubahan yang harus dikomit sangat besar, dan svn statusoutput saya menjadi terlalu lama dan perlu diurai agar bermanfaat. Yang paling penting adalah saya ingin melakukan perubahan yang berasal dari penggabungan, yang berarti mereka menyertakan perubahan properti. Ketika melakukan daftar perubahan, properti svn yang dilampirkan pada direktori tidak dikomit, jadi saya harus melakukan commit ekstra:

svn ci --cl work -m "this commits files from the work changelist only"
svn up
svn ci --depth empty DIR . -m "record merge properties"

Anda mungkin harus melakukan itu untuk beberapa direktori (di sini saya mencatat properti dari DIRdan dari direktori saat ini .), pada dasarnya yang dengan Mdi kolom kedua ketika mengeluarkansvn status perintah.

Larutan

Saya menggunakan patch dan svn patch. Dalam pseudo-code:

svn diff $IGNORE_FILES > MYPATCH   # get the mods to ignore
svn patch --reverse-diff MYPATCH   # remove the mods
svn ci -m "message"                # check-in files and directory properties
svn patch MYPATCH                  # re-apply the mods

Seperti poster lain, saya akhirnya menggunakan skrip untuk mempertahankan daftar file yang diabaikan:

#! /usr/bin/env bash

finish() {
    svn patch MYPATCH               # re-apply the mods
}
trap finish EXIT

IGNORE_FILES="\
sources/platform/ecmwf-cca-intel-mpi.xml \
runtime/classic/platform/ecmwf-cca.job.tmpl \
runtime/classic/platform/ecmwf-cca-intel.xml"

svn diff $IGNORE_FILES > MYPATCH # get the mods to ignore
svn patch --reverse-diff MYPATCH # remove the mods

svn "$@"

Saya biasanya menggunakannya dengan cidan revert -R ..


-1

svn:ignore adalah jawaban anda

Contoh:

$ svn propset svn:ignore -F .cvsignore .
property 'svn:ignore' set on '.'

1
Catatan, contoh di atas menunjukkan cara menggunakan file cvsignore yang sebelumnya dikonfigurasi sebagai input ke properti svnignore Anda.
Ben Hoffstein

1
no svn: abaikan hanya untuk file unversion. dos't bekerja dengan file versi
Sérgio

1
Dan juga bukan lokal. Ini adalah perubahan properti yang akan dilakukan dengan sendirinya.
Adam Badura

-9
svn propset "svn:ignore" "*.xml" .

itu *.xmladalah pola file untuk diabaikan; Anda dapat menggunakan nama direktori di sini juga.


3
-1 karena Anda tidak dapat mengabaikan file yang merupakan bagian dari repositori.
zellus
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.