git कमांड को एक फोल्डर को दूसरे के अंदर ले जाने के लिए


193

मैंने एक फोल्डर बनाया है common स्रोत फ़ाइलों और फ़ोल्डरों के एक समूह के साथ ।

अब मैं commonफ़ोल्डर को फ़ोल्डर में स्थानांतरित करना चाहता हूं includeताकि यह दिखता हैinclude/common

मैंने ये कोशिश की:

  1. git add include

  2. git mv common/ include/

    लेकिन यह इस त्रुटि के साथ विफल हो जाता है

    घातक: बुरा स्रोत, स्रोत = myrepo / सामान्य, गंतव्य = myrepo / शामिल

  3. मैंने कोशिश की git mv common/ include/commonलेकिन मुझे वही त्रुटि मिली

किसी भी विचार यह कैसे प्राप्त करने के लिए?

जवाबों:


177

गिट के बारे में सबसे अच्छी चीजों में से एक यह है कि आपको फ़ाइल का नाम स्पष्ट रूप से ट्रैक करने की आवश्यकता नहीं है। Git फ़ाइलों की सामग्री की तुलना करके इसका पता लगाएगा।

इसलिए, आपके मामले में, इतनी मेहनत न करें:

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

रनिंग git statusआपको कुछ इस तरह दिखाना चाहिए:

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

43
यह मेरे लिए काम नहीं करता है (विंडोज 7, 1.7.6.msysgit.0 का उपयोग करके)। Git को लगता है कि पुरानी फाइलें हटा दी गईं और नई फाइलें जोड़ दी गईं।
बार्ट

हम्म, शायद git कुछ बाहरी उपयोगिता का उपयोग करता है यह निर्धारित करने के लिए कि फ़ाइल साम्यता taht विंडोज पर काम नहीं करती है? यह गिट के कार्यान्वयन का एक मुख्य हिस्सा था।
एंड्रेस जान टैक

13
@OliverF। सुधार: git mvसमतुल्य है।
एंड्रेस जान टैक

25
"गिट के बारे में सबसे अच्छी चीजों में से एक" - इस अच्छी सुविधा के डाउनसाइड्स में से एक यह है कि यह तब विफल हो जाता है जब आप उस फ़ाइल को भी संशोधित करते हैं जिसे काफी हद तक नया नाम दिया गया था, जो कि एक विलोपन को देखने और एक नई फ़ाइल को जोड़ने का कारण बनता है। , इसलिए स्पष्ट रूप से, मैं इसके बजाय स्पष्ट नाम का समर्थन करना पसंद करूंगा।
एरिक कपलुन

2
यदि git लाइन एंडिंग को रूपांतरित करता है, तो यह @Bart द्वारा वर्णित समस्या का परिणाम है। इसके लिए आपको निम्नलिखित कार्य करने होंगे: git config --global core.autocrlf false
Mariano Dupont

163
 git mv common include

कार्य करना चाहिए।

से git mvआदमी पेज :

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

दूसरे रूप में, अंतिम तर्क को एक मौजूदा निर्देशिका होना चाहिए; दिए गए स्रोतों को इस निर्देशिका में स्थानांतरित किया जाएगा
सफल समापन के बाद सूचकांक को अपडेट किया जाता है, लेकिन परिवर्तन अभी भी प्रतिबद्ध होना चाहिए।

चाल से पहले कोई " git add" नहीं किया जाना चाहिए ।


नोट: " git mv A B/", जब Bएक निर्देशिका के रूप में मौजूद नहीं है, तो त्रुटि समाप्त होनी चाहिए, लेकिन यह नहीं हुआ।

Git 1.9 / 2.0 (Q1 2014) के लिए मैथ्यू मोय ( ) द्वारा प्रतिबद्ध c57f628 देखें :moy

Git ट्रेलिंग स्लैश को ट्रिम करता था, और कमांड को ' git mv file no-such-dir' के समतुल्य बनाता था , जिसने फ़ाइल बनाई no-such-dir(जबकि ट्रेलिंग स्लैश ने स्पष्ट रूप से कहा कि यह केवल एक निर्देशिका हो सकती है)।

यह पैच गंतव्य पथ के लिए ट्रेलिंग स्लैश हटाने को छोड़ देता है।
इसकी अनुगामी स्लैश के साथ पथ का नाम बदलने के लिए पारित किया गया है (2), जो उपयुक्त संदेश के साथ त्रुटियां करता है:

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

2
पूरी तरह से काम किया - और का उपयोग कर git mvएक बहुत बेहतर दृष्टिकोण की तरह लग रहा है!
टॉमस पेट्रीक

23

कमान:

$ git mv oldFolderName newFolderName

यह आमतौर पर ठीक काम करता है।

"खराब स्रोत ..." त्रुटि आमतौर पर इंगित करती है कि अंतिम प्रतिबद्ध के बाद स्रोत निर्देशिका में कुछ नाम थे और इसलिए git mv अपेक्षित फ़ाइल नहीं मिल सकती है।

समाधान सरल है - बस आवेदन करने से पहले प्रतिबद्ध करें git mv


15

सुनिश्चित करें कि आपने चलने से पहले स्टेजिंग क्षेत्र में अपने सभी परिवर्तन जोड़ दिए हैं

git mv oldFolderName newFoldername

त्रुटि के साथ विफल रहता है

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

अगर कोई अनकही फाइलें हैं, तो मुझे अभी पता चला है।


"अगर कोई अनकही फाइलें हैं, तो मुझे अभी पता चला है।" - धन्यवाद!
कैकोडर 3

3

एक निर्देशिका में सभी फ़ाइलों को एक उप निर्देशिका में स्थानांतरित करने का दूसरा तरीका (इतिहास को बनाए रखता है):

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


3

मुझे एक समान समस्या थी git mvजहाँ मैं एक फ़ोल्डर की सामग्री को एक मौजूदा फ़ोल्डर में ले जाना चाहता था, और इस "सरल" स्क्रिप्ट के साथ समाप्त हुआ:

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

व्याख्या

  • git ls-files: commonGit में चेक की गई सभी फ़ाइलें ( फ़ोल्डर में) खोजें
  • newdir="../include/$(dirname $f)"; mkdir -p $newdir;: फ़ोल्डर के अंदर एक नया फ़ोल्डर बनाएं include, उसी निर्देशिका संरचना के साथcommon
  • git mv $f $newdir/$(basename "$f"): फ़ाइल को नए बनाए गए फ़ोल्डर में ले जाएं

ऐसा करने का कारण यह है कि git को मौजूदा फ़ोल्डरों में फ़ाइलों को ले जाने में समस्या है, और यह भी विफल हो जाएगा यदि आप किसी गैर-मौजूदा फ़ोल्डर में फ़ाइल को स्थानांतरित करने का प्रयास करते हैं (इसलिए mkdir -p )।

इस दृष्टिकोण के बारे में अच्छी बात यह है कि यह केवल उन फ़ाइलों को छूता है जो पहले से ही चेक करने के लिए तैयार हैं। केवल git mvएक संपूर्ण फ़ोल्डर को स्थानांतरित करने के लिए उपयोग करके , और फ़ोल्डर में अस्थिर परिवर्तन होते हैं, गिट को पता नहीं होगा कि क्या करना है।

फ़ाइलों को स्थानांतरित करने के बाद आप किसी भी शेष अस्थिर परिवर्तनों को हटाने के लिए रिपॉजिटरी को साफ करना चाह सकते हैं - बस पहले सूखने के लिए याद रखें!

git clean -fd -n

2

मुझे खेद है कि मुझे "एंड्रेस जान टैक" के "उत्तर" पर टिप्पणी करने के लिए पर्याप्त प्रतिष्ठा नहीं है।

मुझे लगता है कि मेरा मेसिज हटा दिया जाएगा (लेकिन मैं सिर्फ "लूर्शर" को चेतावनी देना चाहता हूं और अन्य जिन्हें एक ही त्रुटि मिली है: केयरफुल कर

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

यह कारण हो सकता है कि आप नए फ़ोल्डर में अपनी परियोजना का इतिहास नहीं देखेंगे।

मैंने कोशिश की

$ git mv oldFolderName newFolderName

गॉट

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

मैंने किया

git rm -r oldFolderName

तथा

git add newFolderName

और मैं अपने प्रोजेक्ट में पुराना git इतिहास नहीं देखता। कम से कम मेरा प्रोजेक्ट गुम नहीं हुआ है। अब मेरे पास newFolderName में अपना प्रोजेक्ट है, लेकिन इतिहास के बिना (

बस चेतावनी देना चाहते हैं, "एंड्रेस जाॅन टैक" की सलाह का उपयोग करते हुए सावधानी बरतें, यदि आप अपने गिट हिस्ट्री को खोना नहीं चाहते हैं।


सुनिश्चित करें कि आपके सभी परिवर्तन जोड़ दिए गए हैं। जीआईटी "खराब स्रोत" कहने में विफल रहता है अगर कोई परिवर्तन नहीं हुआ है, तो मुझे अभी पता चला है।
केविन प्लक

0

मुझे भी ऐसी ही समस्या थी, लेकिन फ़ोल्डर में जिसे मैं स्थानांतरित करना चाहता था मेरे पास फाइलें थीं जिन्हें मैं ट्रैक नहीं कर रहा था।

मान लीजिए कि मेरे पास फाइलें थीं

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

और मैं केवल ट्रैक की गई फ़ाइलों को सबफ़ोल्डर में स्थानांतरित करना चाहता था subdir, इसलिए लक्ष्य था:

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

मैंने जो किया था वह था:

  • मैंने नया फ़ोल्डर बनाया और उन सभी फ़ाइलों को स्थानांतरित कर दिया, जिन्हें मैं हिलना चाहता था: mkdir tmpdir && mv a b tmpdir
  • पुरानी फ़ाइलों की जाँच की git checkout a b
  • नई उपखंड के लिए नए dir और स्थानांतरित किए गए साफ़ फ़ोल्डर (बिना फ़ाइलों के बिना) बनाए गए: mkdir subdir && mv a b subdir
  • सबडिर से सभी फाइलें जोड़ी गईं (इसलिए Git केवल ट्रैक की गई फ़ाइलों को जोड़ सकता है - यह git add --updateडायरेक्टरी चेंज ट्रिक के साथ कुछ था ): git add subdir(आम तौर पर यह भी अनट्रैक फाइल्स जोड़ देगा - इसके लिए .gitignoreफाइल बनाने की आवश्यकता होगी )
  • git status अब केवल स्थानांतरित फ़ाइलें दिखाता है
  • बाकी फ़ाइलों को tmpdir से subdir में ले जाया गया: mv tmpdir/* subdir
  • git statusऐसा लगता है कि हमने निष्पादित किया git mv:)

-1

मैंने ऐसा करके इसे विंडोज़ पर हल किया:

  • पावर शेल कंसोल खोलें
  • भागना
  • Alt / क्लिक करें और फ़ाइल / फ़ोल्डर नाम कॉलम पर खींचें, फिर कॉपी करें
  • नोटपैड + को पेस्ट करें
  • रेगेक्स के (.*)साथ बदलें: साथ बदलेंgit mv ".\\\1" ".\\<New_Folder_Here>\"
  • नोटपैड ++ से सभी पाठ को कॉपी करें
  • हिट दर्ज करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.