Git ile yeni bir dosyanın sadece bir kısmını nasıl sahne alabilirim?


222

Ben seviyorum --interactive eklemek git . Artık günlük iş akışımın bir parçası.

Sorun, izlenmeyen dosyalarla çalışmadığı anlaşılıyor. Ne yapmak istiyorum yeni bir dosya izlemek, ama sadece bir kısmını ekleyin, yani bu yeni dosyanın bazı bölümleri henüz sahnelenmeye hazır değil.

Örneğin, git add -i ile, yama seçeneğini seçebilir ve hatta yeni kodun bölümlerini yerleştirmek için tek tek parçaları düzenleyebilir ve hata ayıklama kodu yorumlarını işaretsiz bırakabilirim. Bu şekilde çalışmayı seviyorum çünkü şu anda üzerinde çalıştığım mega yamanın hangi yerlerinin hala çalışmaya ihtiyacı olduğu açık.

Ne yazık ki, izlenmemiş bir dosyayla aynı şeyi yapamıyorum. Ya dosyanın tamamını sahneliyorum ya da hiçbir şey. Kullandığım geçici çözüm yeni bir dosyayı boşken hazırlama ve hatta tek tek değişiklikleri olağan şekilde hazırlamadır. Ancak bu çözüm kirli bir saldırı gibi hissediyor ve unuttuğumda veya fikrimi değiştirdiğimde olması gerekenden daha fazla sıkıntı yaratıyor.

Öyleyse soru şu: Yeni bir dosyanın sadece bir kısmını nasıl sahneleyebiliriz, böylece bu yeni dosya izlenir, ancak içeriğinin tamamını veya bir kısmını düzensiz bırakır?

Yanıtlar:


415

Vay, tüm bunlar update-indexve hash-objectişler aşırı derecede karmaşık görünüyor. Bunun yerine:

git add -N new_file
git add -i

Gönderen git help add:

-N, --intent-to-add
    Record only the fact that the path will be added later.  An entry
    for the path is placed in the index with no content.  This is useful
    for, among other things, showing the unstaged content of such files
    with git diff and committing them with git commit -a.

9
++ 1! vadesi gelen kredi. Şimdiye kadar bu </shame>
manajları

1
İyi buldum. Adam sayfasını biraz daha kaydırmalıydım. Belki Git Pro rozetini iade etmeliyim.
dave1010

3
Git-gui'nin neden yeni bir dosyadan satır yerleştirmek için bunu dahili olarak kullanmadığını merak ediyorum.
Deiwin

6
Harika -Nkeşif, teşekkürler! Yine -pde bu durumda birleştirmeyi tercih ederim . gid add -N the_file& git add -p. -NAyrıca şunu da eklemelisiniz-A
Cyril CHAPON

@Deiwin - "git add -N $ FILENAME" yapmak için .gitconfig dosyanıza bir [guitool] ekleyebilirsiniz: [guitool "Niyetle ekle"] cmd = "git add -N $ FILENAME" needsfile = yes noconsole = yes
Steve Folly

7

Bunu yapmanın en kolay yolu (ve genel olarak imho interaktif evreleme) git gui. Git ile birlikte gelir ve git tarafından desteklenen hemen hemen tüm platformlarda çalışmalıdır.

Basitçe çalıştırın git guive bir gui açılacaktır.

Git Gui ekran görüntüsü


Bu yaratıcı bir cevaptır ve bazen çok, çok yararlıdır.
Pablo Olmos de Aguilera C.

3
Tüm git dağıtımlarının içermediği bir not git gui. Örneğin Debian'da 'git-gui' adı verilen ayrı bir pakette.
cristoper

Yıllardır bu özellik için (yeterince zor değil) bakıyorum, bu bir hayat değiştirici
austinmarton

2
Benim için izlenmeyen dosyaların tek satırlarının sahnelenmesi git guihiç işe yaramadı. Aslında, bu menü seçeneklerini devre dışı bırakır .
Deiwin

2
@Deiwin Bunu aslında soruda kaçırmış olmalıyım - ekran görüntüm zaten izlenmiş bir dosyayı gösteriyor. git guiYeni bir dosya için kullanmak istiyorsanız, önce çalıştırmanız gerekir git add -N new_file- Richard Hansen'ın cevabına bakın.
Chronial

6
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
git add --interactive newfile

Basit demo:

mkdir /tmp/demo
cd /tmp/demo
git init .

echo hello > newfile
git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile
  • İpucu Git nesnesi veritabanınızda 'boş' blobun zaten bulunduğundan eminseniz, e69de29bb2d1d6434b8b29ae775ad8c2e48c5391bunun yerine karma kodunu yazabilirsiniz . Bunu tavsiye etmiyorum
  • İpucu Windows kullanıyorsanız, muhtemelen NUL:bunun yerine kullanabilirsiniz /dev/null. Aksi takdirde,echo -n '' | git hash-object --stdin -w

Şimdi dizin newfileboş blob olarak içerilecek ve boş blob henüz mevcut değilse nesne veritabanına girilmiştir:

$ find .git/objects/ -type f 
.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391

$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
#   (use "git rm --cached <file>..." to unstage)
#
#   new file:   newfile
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   newfile
#

$ git diff
diff --git a/newfile b/newfile
index e69de29..ce01362 100644
--- a/newfile
+++ b/newfile
@@ -0,0 +1 @@
+hello

Bu tam olarak istediğiniz gibi olmalıdır. Ayrıca çok akıllı dizin yönetimi için vim kaçak eklentisini önerebilir miyim (bkz. Better git add -p? )


1
Bu iyi çalışıyor gibi görünüyor. Hatırlamak biraz karmaşık olduğu için "stage-empty-file" olarak adlandırdım.
dave1010

@ dave1010: Yardımcı olduğuna sevindim! Evet, bir takma ad eklemeyi düşündüm, ancak genel olarak joker karakterler veya birden çok dosya adı argümanını nasıl ele alacağınızı bilmiyordum. Bu yüzden
seçmedim

2

Düzenleme: Bu şu anda çalışmıyor gibi görünüyor. Eminim daha önceydi (git 1.7.1'de). Eğer işe yaramazsa, /dev/nullsehe yukarıda belirtildiği gibi evrelemeyi öneririm :

git update-index --add --cacheinfo 100644 $(git hash-object -w /dev/null) newfile

Windows kullanıyorsanız (olmadan /dev/null), boş bir dosya yolu ile değiştirebilirsiniz.

Orijinal cevap

İstediğiniz

git add -p # (or --patch)

Bu benim için izlenmeyen dosyalar ekler. Man sayfasından:

Dizin ve çalışma ağacı arasındaki yama parçalarını etkileşimli olarak seçin ve dizine ekleyin. Bu, kullanıcıya dizine değiştirilmiş içerik eklemeden önce farkı gözden geçirme şansı verir.

Bu etkili bir şekilde add - interactive çalıştırır, ancak ilk komut menüsünü atlar ve doğrudan yama alt komutuna atlar. Ayrıntılar için “Etkileşimli mod” a bakın.


2
Ne kadar ilginç olsa da, benim için işe yaramıyor (git 1.7.4); git add -p newfilehiç çalışmıyor (nu etkisi) ve git add --interactive'[a] dd izlenmemiş' etkisi git add newfilevardır; Edit ayrıca git 1.7.5.3 ile kontrol edildi; zar yok
sehe

Windows için iyi bir ipucu, cevabımda bunun için ipuçları ekledi. Thx
sehe

-2

Sadece başka bir ihtimalin kaydı için:

git add -N file
git add -p file

Ve sonra iri parçalara sahne verebilir veya bunları yerinde düzenleyebilirsiniz.


1
Bu cevap, 2011 yılına dayanan kabul edilen cevapla aynı şeyi söylüyor.
Stanislav Pankevich

Kabul cevap birleştirir add -Nile add -i. Bunu sadece işler add -pyerine ekledim add -i.
Pedro Adame Vergara
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.