klasörü başka bir klasöre taşımak için git komutu


194

commonBir sürü kaynak dosya ve klasör içeren bir klasör oluşturdum .

Şimdi commonklasörü klasöre taşımak includeistiyorum.include/common

Bunları denedim:

  1. git add include

  2. git mv common/ include/

    ama bu hatayla başarısız oluyor

    ölümcül: kötü kaynak, kaynak = myrepo / ortak, hedef = myrepo / include

  3. Denedim git mv common/ include/commonama aynı hatayı alıyorum

Bunu nasıl başaracağınız hakkında bir fikriniz var mı?

Yanıtlar:


177

Git ile ilgili en güzel şeylerden biri, dosya adlarını açıkça izlemenize gerek olmamasıdır. Git, dosyaların içeriğini karşılaştırarak çözecektir.

Yani, sizin durumunuzda, çok fazla çalışmayın:

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

Koşu git statussize böyle bir şey göstermelidir:

$ git status
# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   renamed:    common/file.txt -> include/common/file.txt
#

44
Bu benim için işe yaramıyor (Windows 7, 1.7.6.msysgit.0 kullanarak). Git eski dosyaların silindiğini ve yeni dosyaların eklendiğini düşünüyor.
Bart

Hmm, belki git Windows üzerinde çalışmayan dosya sameness belirlemek için bazı harici yardımcı programı kullanır? Bu, git uygulamasının temel bir parçasıydı.
Andres Jaan Tack

13
@OliverF. Düzeltme: git mveşdeğerdir.
Andres Jaan Tack

25
"Git ile ilgili en güzel şeylerden biri " - bu güzel özelliğin dezavantajlarından biri, büyük ölçüde yeniden adlandırılan dosyayı da değiştirdiğinizde başarısız olmaya başlamasıdır, bu da silinmesini ve yeni bir dosyanın eklenmesini görmesini sağlar. , açıkçası, bunun yerine açık yeniden adlandırma desteğini tercih ederim.
Erik Kaplun

2
Git satır sonlarını dönüştürürse, bu @Bart tarafından açıklanan soruna neden olur. Bunun çalışması için aşağıdakileri yapmanız gerekir: git config --global core.autocrlf false
Mariano Dupont

164
 git mv common include

çalışmalı.

Gönderen git mvadam sayfası :

git mv [-f] [-n] [-k] <source> ... <destination directory>

İkinci formda, son argüman mevcut bir dizin olmalıdır; verilen kaynaklar bu dizine taşınır .
Dizin başarılı bir şekilde tamamlandıktan sonra güncellenir, ancak değişiklik yine de yapılmalıdır.

git addHareketten önce hiçbir " " yapılmamalıdır .


Not: " git mv A B/", Bdizin olarak bulunmadığında hata vermelidir, ancak olmadı.

Git 1.9 / 2.0 (Q1 2014) için Matthieu Moy ( ) tarafından taahhüt edilen c57f628'e bakınız :moy

Git, izleyen eğik çizgiyi kırpmak ve git mv file no-such-dirdosyayı oluşturan ' ' komutuna eşdeğer yapmak için kullanılır no-such-dir(izleyen eğik çizgi, yalnızca bir dizin olabileceğini açıkça belirtirken).

Bu yama, hedef yol için sondaki eğik çizgi kaldırmasını atlar.
Sondaki eğik çizgiye sahip yol, uygun mesajla hata veren yeniden adlandırmaya (2) iletilir:

$ git mv file no-such-dir/
fatal: renaming 'file' failed: Not a directory

2
Mükemmel çalıştı - ve kullanımı git mvçok daha iyi bir yaklaşım gibi görünüyor!
Tomas Petricek

23

Komut:

$ git mv oldFolderName newFolderName

Genellikle iyi çalışır.

Hata "kötü kaynak ..." genellikle son işlemden sonra kaynak dizinde bazı yeniden adlandırmaların bulunduğunu ve bu nedenle git mvbeklenen dosyayı bulamadığını gösterir.

Çözüm basit - sadece uygulamadan önce taahhüt edin git mv.


15

Çalıştırmadan önce hazırlama alanındaki tüm değişikliklerinizi eklediğinizden emin olun

git mv oldFolderName newFoldername

git hata ile başarısız oluyor

fatal: bad source, source=oldFolderName/somepath/somefile.foo, destination=newFolderName/somepath/somefile.foo

herhangi bir unadded dosya varsa, ben sadece öğrendim.


"herhangi bir unadded dosya varsa, bu yüzden yeni öğrendim." - Teşekkürler!
cacoder

3

Bir dizindeki tüm dosyaları bir alt dizine taşımanın başka bir yolu (git geçmişini tutar):

$ for file in $(ls | grep -v 'subDir'); do git mv $file subDir; done;


Dikkat: Klasörünüzde / dosya adınızda boşluk varsa bu sorun yaratacaktır!
dejoma

3

Ben git mvbir klasör içeriğini mevcut bir klasöre taşımak istedim ve bu "basit" komut dosyası ile sona erdi benzer bir sorun vardı :

pushd common; for f in $(git ls-files); do newdir="../include/$(dirname $f)"; mkdir -p $newdir; git mv $f $newdir/$(basename "$f"); done; popd

açıklama

  • git ls-files: commonGit'te işaretli tüm dosyaları ( klasörde) bul
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;: Klasörün içinde, includedizin yapısı ile aynı dizin yapısına sahip yeni bir klasör oluşturun.common
  • git mv $f $newdir/$(basename "$f"): Dosyayı yeni oluşturulan klasöre taşıyın

Bunu yapmanın nedeni git'in dosyaları mevcut klasörlere taşımada sorun yaşaması gibi görünüyor ve bir dosyayı var olmayan bir klasöre taşımaya çalıştığınızda da başarısız olacaktır (bu nedenle mkdir -p).

Bu yaklaşımla ilgili güzel olan şey, sadece git için zaten teslim edilmiş olan dosyalara dokunmasıdır. Sadece git mvtüm bir klasörü taşımak için kullanılır ve klasörde değişiklik yapılmayan değişiklikler varsa, git ne yapacağını bilemez.

Dosyaları taşıdıktan sonra, kalan tatsız değişiklikleri kaldırmak için havuzu temizlemek isteyebilirsiniz - önce kuru çalıştırmayı unutmayın!

git clean -fd -n

Dikkat: Klasörünüzde / dosya adınızda boşluk varsa bu sorun yaratacaktır!
dejoma

2

"Andres Jaan Tack" in "cevabını" yorumlamak için yeterli itibarım yok.

Mesajımın silineceğini düşünüyorum ((Ama sadece "lurscher" u ve aynı hatayı alan diğerlerini uyarmak istiyorum: dikkatli olun

$ mkdir include
$ mv common include
$ git rm -r common
$ git add include/common

Projenizin git geçmişini yeni klasörde görmeyebilirsiniz.

denedim

$ git mv oldFolderName newFolderName

var

fatal: bad source, source=oldFolderName/somepath/__init__.py, dest
ination=ESWProj_Base/ESWProj_DebugControlsMenu/somepath/__init__.py

yaptım

git rm -r oldFolderName

ve

git add newFolderName

ve projemde eski git tarihini görmüyorum. En azından projem kaybolmadı. Şimdi projem newFolderName'de var, ancak tarihsiz (

Sadece uyarmak istiyorum, git hsitory kaybetmek istemiyorsanız, "Andres Jaan Tack" tavsiye kullanarak dikkatli olun.


Tüm değişikliklerin eklendiğinden emin olun. Git eklenmemiş değişiklikler varsa "kötü kaynak" demiyor, bu yüzden yeni öğrendim.
Kevin Pluck

0

Benzer bir sorunum vardı, ancak taşımak istediğim klasörde izlemediğim dosyalar vardı.

diyelim dosyalarım var

a/file1
a/untracked1
b/file2
b/untracked2

Ve sadece izlenen dosyaları alt klasöre taşımak istedim subdir, bu yüzden amaç şuydu:

subdir/a/file1
subdir/a/untracked1
subdir/b/file2
subdir/b/untracked2

ne yapmıştı:

  • Yeni bir klasör oluşturdum ve taşımakla ilgilendiğim tüm dosyaları taşıdım: mkdir tmpdir && mv a b tmpdir
  • eski dosyaları teslim aldım git checkout a b
  • yeni dizin oluşturdu ve temiz klasörler (izlenmemiş dosyalar olmadan) yeni alt dizine taşıdı: mkdir subdir && mv a b subdir
  • alt dizindeki tüm dosyaları ekledi (Git sadece önceden izlenen dosyaları ekleyebilirdi - git add --updatedizin değiştirme hilesi ile biriydi ): git add subdir(normalde bu izlenmemiş dosyaları bile ekler - bu .gitignoredosya oluşturmayı gerektirir )
  • git status şuan sadece taşınan dosyaları gösteriyor
  • kalan dosyaları tmpdir'den alt dizine taşıdı: mv tmpdir/* subdir
  • git statusidam ettik gibi görünüyor git mv:)

-1

Bunu yaparak bunu pencerelerde çözdüm:

  • Güç kabuğu konsolunu aç
  • koşmak
  • Alt tuşunu basılı tutarak dosya / klasör adı sütununu sürükleyin ve ardından kopyalayın
  • Not defterine yapıştırın ++
  • regex (.*)ile değiştirin: ile değiştiringit mv ".\\\1" ".\\<New_Folder_Here>\"
  • notepad ++ 'dan tüm metni powershell'e kopyala
  • Enter tuşuna basın
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.