Dosyayı Git deposunda tut, ancak değişiklikleri izleme


305

Repo içinde olmasını isteyeceğim ama herhangi bir değişiklik izlemek istemeyeceğiniz bir CodeIgniter sitesinde birkaç dosya var.

Örneğin, bu çerçevenin yeni bir yüklemesini yeni bir istemciye dağıtırım, aşağıdaki dosyaların indirilmesini istiyorum (varsayılan değerleri CHANGEME'dir) ve yalnızca bu istemciye (veritabanı kimlik bilgileri, e-posta adresi bilgileri, özel CSS).

// the production config files i want the files but they need to be updated to specific client needs
application/config/production/config.php
application/config/production/database.php
application/config/production/tank_auth.php
// index page, defines the environment (production|development)
/index.php
// all of the css/js cache (keep the folder but not the contents)
/assets/cache/*
// production user based styling (color, fonts etc) needs to be updated specific to client needs
/assets/frontend/css/user/frontend-user.css

Şu anda koşarsam

git clone git@github.com:user123/myRepo.git httpdocs

ve sonra yukarıdaki dosyaları düzenleyin, hepsi harika. Bir düzeltme veya düzeltme eki yayınlayıp çalıştırmayana kadar git pull. Tüm değişikliklerimin üzerine yazılır.





İstemci kimlik bilgilerini / yapılandırma dosyalarını yok sayabilir ve repo yüklendiğinde programın eksik olması durumunda programın varsayılan dosyaları oluşturmasını sağlayabilirsiniz.
MatthewG

Yanıtlar:


618

git bunu yapmak için farklı bir çözüme sahiptir. İlk olarak izlenmesini istemediğiniz dosyayı değiştirin ve aşağıdaki komutu kullanın:

git update-index --assume-unchanged FILE_NAME

ve değişiklikleri tekrar izlemek istiyorsanız bu komutu kullanın:

git update-index --no-assume-unchanged FILE_NAME

git-update-index belgeleri


Söylediklerinizi yaptım ama git durumu dosyanın değiştirildiğini söylemeye devam ediyor
rraallvv

7
Evet, bu "Kabul Edilen Cevap" olmalıdır. Benim için çalıştı.
joshmcode

34
Junio ​​Hamano'ya (Git'in koruyucusu) göre: "Varsay-değişmeden bir yoksay mekanizması için kötüye kullanılmamalıdır. [...] Git'in Git'in her zaman bu yolların değiştirilmediğini düşüneceği vaadi değildir. varsayım-değişmemiş olarak işaretlenmiş bir yolu ekstra lstat (2) maliyetine neden olmadan değiştiğini belirleyebilir, yolun değiştirildiğini bildirme hakkını saklı tutar (sonuç olarak, "git commit -a" değişiklik)." Başka bir deyişle, değişmeyen varsayım sadece yerel performans sorunları içindir. Git bu dosyaların daha açık bir şekilde değiştiğini belirleyebiliyorsa, değişecektir.
Alejandro García Iglesias

41
Bunun için bilgileri okurken, --skip-worktreeseçenek bu işe daha uygun olduğunu düşünüyorum --assume-unchanged.
PJSCopeland

26
--skip-worktree gerçekten daha iyi bir seçenektir. Daha fazla bilgi: stackoverflow.com/questions/13630849/…
Özelleştirici

80

Bir cevabı başka bir cevabın yorumlarından çıkarmak için:

$ git update-index --skip-worktree FILENAME

Daha iyi bir seçenek gibi görünüyor --assume-unchanged

Bununla ilgili daha fazla bilgiyi burada bulabilirsiniz: Git - 'Varsay-değişmedi' ve 'atla-çalışma ağacı' arasındaki fark



Bunu yaptığımda ve sonra dalları değiştirmeye çalıştığımda, "Aşağıdaki izlenmeyen çalışan ağaç dosyalarının kasasıyla üzerine yazılacaktı ... Lütfen dalları değiştirmeden önce bunları taşıyın veya kaldırın". Kaçınılması gereken herhangi bir fikir var mı?
Patrick Szalapski

@Aexl tarafından atıfta bulunulan makale compiledsuccessfully.dev/git-skip-worktree
Andrew Keeton

1
Docs bu kötü bir fikir olduğunu söylüyorlar. "Kullanıcılar genellikle Git'e izlenen dosyalarda yapılan değişiklikleri yok saymasını söylemek için varsayım-değiştirilmemiş ve atlama-çalışma ağacı bitlerini kullanmaya çalışırlar. Genel olarak Git, izlenen dosyalarda yapılan değişiklikleri yok saymanın bir yolunu sağlamaz, bu nedenle alternatif çözümler önerilir. "
Curtis Blackwell

58

Kod Ateşleyici projelerim için database.php.example ve config.php.example dosyalarını depoda saklıyorum .

Sonra eklemek config.php ve uygulamaları / config / DatabaseFunctions.php için .gitignore dosyası.

Son olarak, dağıttığımda .example dosyalarını (config.php ve database.php'ye) kopyalayabilir, özelleştirebilirim ve GIT tarafından izlenmezler.


12
Güzel bir çözüm, ama bence nasirkhan'ın cevabı en iyisi.
wordsforthewise

Bu iyi bir çözüm değil. Git endeksinizi yıkarsanız, istemediğiniz zaman değişiklikleri izlemeye başlayacaksınız. Bunu yapmanın doğru yolu için @nasirkhans yanıtına bakın.
Brian Melton-Grace - MSFT

3
Önceki yorumlara katılmıyorum. Bu şekilde, "varsayılan" değerleri kontrol etmek ve yerel yapılandırmanızı başka bir yere kopyalamak zorunda kalmadan güncellemek çok daha kolaydır. Ayrıca, tüm depolar için geçerlidir, böylece tekrarlanan herhangi bir repo değişikliği yapmanız gerekmez.
OskarD90

1
eğer gitignore ise neden tekrar değişiklikleri izlemeye başlasın
Shapeshifter

OP'nin problemini çözer, ancak soruya gerçekten cevap vermez.
Travis Wilson

1

Bunları .gitignoredosyanıza koyar ve gerektiğinde manuel olarak kopyalarım.

Bu yüzden iskelet dosya adı git, yoksayma dosya adları git içinde olmaz (.gitignore içinde). Bu şekilde, bunları 'şablondan' (gerçekte iskeletten daha iyi bir isim) kopyalamak için manuel adım tamamlandığında hemen göz ardı edilir.


1
onları önce repoya ekleyip .gitignore'a eklemenin bir yolu yok mu? Dosyaları dahil etmek için bir çözüm olsaydı harika olurdu, ancak belirli bir taahhütten veya herhangi bir şeyden sonra herhangi bir değişiklik olmazdı.
gorelative

1
@mklauber Koşana kadar süresiz olarak tutmak istiyorum git rm <file>. Amaç IE: bir config.php dosyasıdır. Ben yapılandırma dosyasını tutmak istiyorum ama açıkçası farklı oldukları gibi istemciden istemciye veritabanı kimlik bilgilerini izlemek istemiyorum.
gorelative

1
Evet, raylar database.yml dosyamızla ilgili bir sorunum var. Bir iskelet tutup kopyalayıp değiştiriyoruz.
Michael Durrant

Bu "Skeleton" yapılandırma dosyalarını oluşturursam, onları ilk işleme ekler misiniz? ve sonra dosyayı yoksaymak için .gitignore değiştirilsin mi? Aslında dosyayı depoda tutmak ama bir iskelet olarak?
gorelative

10
Şu iki seçeneğiniz vardır: Dosyayı tarafından ekleyin git add file1ve ardından .gitignoredosyanızı düzenleyin . Taahhüt edilen dosya orada kalacak ve güncellenmeyecektir. Veya: Dosyayı içine zorlamak için .gitignoreekleyebilir ve sonra ile ekleyebilirsiniz git add --force file1. Dosyanın üzerine yazmak istediğinizde 2. seçeneği kullanabilirsiniz
klaustopher

1

Verilen cevaplar problemi kısmen çözüyor, ama daha da fazla problem getiriyor.

"Web.Local.config" dosyasını korumam gerekiyordu. Benim için çalışan tek çözüm:

1. Dosyayı projeden hariç tutun

2. Web.LocalTemplate.config olarak dosyanın ayrı bir kopyasını oluşturun

Artık "Web.LocalTemplate.config" Git tarafından izlendiğine göre, tüm geliştiriciler bunu bir başlangıç ​​noktası olarak kullanabilir. Ancak, projenin bir parçası olmayan "Web.Local.config" otomatik olarak yok sayılır.


Nasıl olduğunu git update-index --skip-worktree FILENAMEsadece kısmen sorununuzu çözme, hatta daha fazla soruna ekleyerek ?? Tam olarak ne yapmaya çalıştığınızı çözer. Onu denedin mi?
Amir Asyraf
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.