"पिछले ऑपरेशन समाप्त नहीं हुआ है" के कारण तोड़फोड़?


229

अगर मैं अपने तोड़फोड़ रेपो को अपडेट करने की कोशिश करता हूं, तो यह कहता है कि मुझे क्लीनअप चलाना चाहिए। यदि मैं क्लीनअप चलाता हूं, तो यह कहता है कि एक फ़ाइल गायब है। (मैंने आज सुबह अपने होम पीसी से फाइल करने में असफल फाइलों की एक MASSIVE डायरेक्टरी को डिलीट कर दिया था, लेकिन फिर मैंने काम से फाइलों का एक ही सेट किया, और अब मेरा होम रेपो बस्ट है)। तो, सफाई कहते हैं:

सफाई ब्लाब्लाबला को संसाधित करने में विफल रही, फाइल ब्लाब्लाब्ला को रीड-राइट सेट नहीं किया जा सकता: सिस्टम निर्दिष्ट फ़ाइल को नहीं ढूंढ सकता।

अगर मैं इसे अपडेट करता हूं तो यह कहता है:

कमांड: अपडेट त्रुटि: पिछला ऑपरेशन समाप्त नहीं हुआ है; 'क्लीनअप' चलाएं अगर यह बाधित था: कृपया 'क्लीनअप' कमांड निष्पादित करें। पूरा कर लिया है!:

मैं यह कैसे प्राप्त करूँ?


(सभी एसवीएन जानकारी को हटाने के अलावा, और फिर से जांचना)
कोडरमा

3
उस कष्टप्रद त्रुटि के कारण मुझे svn से नफरत है। हर बार इसका सामना करने के बाद मुझे फिर से चेकआउट करना पड़ता है क्योंकि रूट फ़ोल्डर या पैरेंट फ़ोल्डर से सफाई काम नहीं करती है। लेकिन सबसे बड़ी समस्या यह है कि यह उस समय ओवरले आइकन प्रदर्शित नहीं करता है, इसलिए मुझे पता नहीं है कि कौन सी फाइल को बैकअप करने से पहले बदल दिया गया है
phuclv

@ Sigurd-v द्वारा पोस्ट उस प्रश्न का वास्तविक उत्तर है जिसने मुझे और दूसरों को बहुत मदद की: stackoverflow.com/a/22717607/5613292
मेहदी जवन

जवाबों:


102

मैं ऐसी ही स्थितियों में रहा हूं। क्या आपने अपने कार्यक्षेत्र की जड़ से सफाई चलाने की कोशिश की है? मुझे पता है कि कभी-कभी एक बच्चे की निर्देशिका (जहां समस्या निहित है) से सफाई काम नहीं करती है, और कार्यक्षेत्र की जड़ से सफाई करता है।

अगर वह अभी भी विफल रहता है, क्योंकि आपने एक बच्चे को कहीं गायब कर दिया था। बच्चे के डिर से 1 स्तर अधिक हटाने की कोशिश करें (यह मानते हुए कि रूट नहीं है), और अपडेट और क्लीनअप फिर से कोशिश कर रहा है।

यदि सफाई के प्रयास किसी भी स्तर पर सफल नहीं हो रहे हैं, तो इसका उत्तर दुर्भाग्य से एक नई कार्य प्रतिलिपि है।


4
बच्चे से सफाई के लिए dir! इससे मेरा काम बनता है!
फ्रांवा

1
यदि आप इसे पढ़ रहे हैं तो आप मुश्किल में हैं :) मैं कभी भी गित (अब तक) के साथ इस तरह की गड़बड़ी में नहीं भागा। यदि मैं Svn मुझे जाने देता, तो मैं किसी भी निर्देशिका में सफाई / पुन: सफाई / सफाई आदि समाप्त कर देता।
एलोपी

2
@ Sigurd-v द्वारा पोस्ट उस प्रश्न का वास्तविक उत्तर है जिसने मुझे और दूसरों को बहुत मदद की: stackoverflow.com/a/22717607/5613292
मेहदी जवन

मैंने Windows FileExplorer (Turtoise के साथ) से क्लीनअप चलाया और इसने मुझे अधिक विस्तृत त्रुटि दी, जो मुझे बताती है कि समस्या के साथ फ़ाइल क्या थी, किसी भी तरह SVN ने वह फ़ाइल खो दी, एक darm *। Cache फ़ाइल, इसलिए मैंने एक और .cache लिया। और लापता फ़ाइल को बदलने के लिए इसका नाम बदलें, क्लीनअप चलाएं, कोई भी त्रुटि नहीं है, यह सब ठीक है !!
झोलमैन

331

नए चेकआउट या कॉपी करने के लिए अक्सर कोई आवश्यकता नहीं होती है।

मैंने अभी भी इसी तरह की समस्या से संबंधित एक समस्या को हल किया है "पिछले ऑपरेशन समाप्त नहीं हुआ है" इस से मदद के साथ ( लिंक )

ऐसा लगता है कि svn कभी-कभी आदेश / संचालन को संसाधित करते समय अटक जाता है। इन सभी ऑपरेशनों को .svn फ़ोल्डर में डेटाबेस फ़ाइल wc.db में संग्रहीत किया जाता है।

SQLite को मेरी चेकआउट निर्देशिका में डाउनलोड करके और चलाकर

sqlite3.exe .svn/wc.db "select * from work_queue"

आप सभी लंबित कार्यों की सूची प्राप्त कर सकते हैं। ये ऑपरेशन वे हैं जो त्रुटि "समाप्त नहीं" के रूप में संदर्भित कर रहे हैं।

चलाकर

sqlite3.exe .svn/wc.db "delete from work_queue"

पुराने सभी कार्यों को कार्य कतार से हटा दिया जाता है और त्रुटि समाप्त हो जाती है। नए चेकआउट या कुछ भी करने की आवश्यकता नहीं है


5
उपरोक्त उपाय को आजमाने से पहले आपको हमेशा क्लीनअप चलाने की कोशिश करनी चाहिए। यह काम करता है अगर आप एक नई एसवीएन रिपॉजिटरी को एक नई वर्किंग कॉपी चेकआउट किए बिना चलाना और चलाना चाहते हैं।
सिगर्ड वी

7
Sqlite.exe डाउनलोड कर रहा है और नष्ट चल रहा था वास्तव में तेजी से बाहर की जाँच और विलय से - महान जवाब
जेफरी नाइट

12
मैंने इसके बाद भी "लॉक" किया है, लेकिन इसे "svn cleanup" के साथ पा लिया है
जेफरी नाइट ने

1
मैंने इसे डेबियन पर चलाया, apt-get install sqlite3 का उपयोग करके इंस्टॉल किया, फिर आप उपरोक्त आदेशों को बिना .exe के चला सकते हैं
रिचर्ड मर्चेंट

3
मुझे 'लॉक' संदेश भी मिला, लेकिन फिर मैंने 'क्लीन अप' कमांड बॉक्स को चेक किया, जो कहता है कि "ताले तोड़ता है", और यह काम किया
मैककॉय

114

कंसोल चलाने से svn cleanupमेरे लिए वही समस्या हल हो गई है।


20
कंसोल कमांड svn cleanupभी कछुआ एक्सप्लोरर प्लग-इन का उपयोग करने की तुलना में अधिक विस्तृत जानकारी प्रदान करेगा, जो इसे इस तरह की स्थितियों में बहुत उपयोगी बनाता है।
ब्रैंडन एस

7
कंसोल कमांड चलाने से वास्तव में समस्या को हल करने के लिए पर्याप्त जानकारी मिल जाएगी। यह एक बेहतर जवाब है।
DDS

1
अच्छी तरह से मैं सबसे शीर्ष फ़ोल्डर का चयन किया और इस्तेमाल किया svn cleanup, धन्यवाद
डेडफिश

मुझे अक्सर मूल निर्देशिकाओं को ट्रेस करने और उन पर सफाई चलाने के साथ सफलता मिली है, लेकिन यह थोड़ा समय लेने वाला और 'जादू' है। कभी नहीं पता था कि यह एक विस्तृत त्रुटि लौटाएगा, +1।
फिल कूपर

जब आप चलते हैं svn cleanup, तो सुनिश्चित करें कि कंसोल ऊंचा है। मैंने शुरू में ऐसा नहीं किया और मुझे red-write: Access is deniedत्रुटि मिली ।
टोनी

26

मैं सिर्फ एक समान मुद्दा था। रनिंग प्रोसेस एक्सप्लोरर ने दिखाया कि एक अन्य प्रोग्राम (नोटपैड ++) में एक फ़ोल्डर के लिए एक फ़ाइल हैंडल था जिसे एसवीएन ने हटाने की कोशिश की थी। जब मैंने नोटपैड ++ को बंद किया, तो "क्लीन अप" सफलतापूर्वक चलने में सक्षम था।


यह प्रश्न में वर्णित समस्या का उत्पादन कर सकता है। लेकिन मुझे डर है, अगर यह पहले से ही हुआ है तो यह इसे अलग नहीं कर सकता।
गंगानुस

19

मैं एक जार जोड़ने के बाद इस समस्या का सामना कर रहा था जो पहले से ही एसवीएन में है और मैंने उसी नाम के साथ इसका नया संस्करण जोड़ा।

ग्रहण में मैंने यह कोशिश की

  1. फोल्डर> टीम> रिफ्रेश / क्लीनअप पर राइट क्लिक करें।
  2. स्वच्छ, निर्माण और मेरे आवेदन को ताज़ा करें।
  3. ग्रहण को पुनः प्रारंभ करें।

उपरोक्त चरणों का उपयोग करके मैं सिंक्रनाइज़ करने में सक्षम हूं।


1
मेरे लिए काम किया। बस, तीसरा चरण अनिवार्य नहीं है (ग्रहण को पुनः आरंभ करें)।
jpmottin

यह मेरे लिए भी काम किया है, मैंने बहुत सी चीजों की कोशिश की लेकिन काम नहीं किया। मैंने अपना दृश्य स्टूडियो बंद कर दिया और क्लीन-अप चलाया। बहुत बहुत धन्यवाद
अम्मानपल्ली

18

मैंने यहां सबसे अधिक मतों के जवाब देने की कोशिश की थी और कुछ अन्य लोगों ने कोई फायदा नहीं उठाया। मेरी WORK_QUEUEमेज खाली थी और मैं एक उच्च फ़ोल्डर में साफ करने की कोशिश करने में सक्षम नहीं था। क्या किया था निम्नलिखित (इस कछुआ SVN के माध्यम से है) काम था,

  • फ़ोल्डर पर राइट क्लिक करें
  • TortoiseSVN पर जाएं -> क्लीन अप ...
  • सुनिश्चित करें कि विकल्प Break Locksटिक गया है और ठीक पर क्लिक करें

क्लीन अप ऑपरेशन अब सफलतापूर्वक पूरा हुआ और मैं इसे जारी रख सकता हूं। Sqlite3 या अन्य दृढ़ समाधानों के डाउनलोड की आवश्यकता नहीं है।


2
ब्रेक के ताले वो नहीं करते जो मैंने सोचा था। यह केवल स्थानीय ताले को तोड़ता है जो आपके सिस्टम पर उपयोग करता है। उस ताले को नहीं जिसे किसी और ने सेट किया है।
ब्रायन कार्लटन

1
sqlite3 ने कभी-कभी मेरी समस्या को हल किया, लेकिन उस विधि को याद रखना बहुत मुश्किल था और सफाई करना बहुत बार विफल रहा। इस विधि ने मुझे बचा लिया ..
sc

9

आपकी फ़ाइलें खुली रहने के दौरान सफाई चलाने का प्रयास करने से मुझे समस्याएँ हुईं। जैसे ही मैंने अपना एप्लिकेशन (विज़ुअल स्टूडियो) बंद किया मैं क्लीन अप भाग गया और यह सफल रहा


1
सच। सुनिश्चित करें कि आपकी फ़ाइलें उपयोग में नहीं हैं या किसी भिन्न उपयोगकर्ता जैसे कि Windows पर व्यवस्थापक के रूप में जाँच नहीं की गई हैं।
मेंढक

6

मैं कछुआ SVN का उपयोग करता हूं। जब सफाई विफल हो, तो सफाई विकल्प की जाँच करें

सुनिश्चित करें कि ताले को तोड़ने का विकल्प चेक किया गया है।

सफाई कदम

  • फ़ोल्डर का पता लगाने में बाईं माउस बटन
  • 'कछुआ SVN' -> 'क्लीन अप ...' मेनू चुनें
  • चेक ' ब्रेक ताले ' की जाँच की और 'ठीक' दबाएँ

यह पहले से ही उत्तर दिया है, लेकिन कभी-कभी चित्र मदद करता है

यहां छवि विवरण दर्ज करें


4

मुझे वही समस्या मिली, मेरे मामले में मैं आवेदन के साथ svn कछुआ का उपयोग कर रहा था। रूट मोड में विंडोज़ के cmd शेल का उपयोग करके मैंने svn क्लीनअप और फिर svn अपडेट लागू किया .... फिर आप आवेदन मोड में वापस आ सकते हैं और यह पूरी तरह से काम करेगा!


2

मैंने .svn फ़ोल्डर को अन्य स्थान पर हटाने का प्रयास किया और इसे उसी मूल फ़ोल्डर में वापस रखा। जब मैंने एसवीएन को अपडेट करने की कोशिश की, तो यह अपडेट हो गया। मुझे नहीं पता कि यह वास्तव में कैसे काम करता है।


2

मुझे एक ही समस्या थी, और किसी तरह मैंने पाया कि मेरे पास सी: \ स्तर पर एक .svn फ़ाइल छिपी थी। एक बार जब मैंने इस छिपे हुए फ़ोल्डर (.svn) को हटा दिया, तो सब कुछ ठीक चला। मुझे रूट ड्राइव पर अनायास ही एक कार्यशील निर्देशिका बना लेनी चाहिए।


2

मेरे मामले में मेरे पास गुल-घड़ी चल रही थी जो समस्याओं का कारण थी। इसे रोकने के बाद मैं क्लीनअप कमांड निष्पादित कर सकता था।


इससे मुझे अवांछित जेवीएम और प्रगति को मारने में मदद मिली।
डिश

2

हाय मेरे मामलों में मैं दृश्य स्टूडियो को बंद करने और क्लीनअप को फिर से प्रयास करने के बाद यह अच्छा समय है


2

मैं भी उसी मुद्दे के साथ फंस गया हूं जिसे मैंने झटका देने की कोशिश की है:

1. कोशिश svn यानी TSVNCache.exe और TortoiseProc से संबंधित प्रक्रिया को मार डालो। 2. जो भी मेरे पास svn में है, उसी की बिना पड़ी फाइलें और डिलीट करके। 3. कमांड प्रॉम्प्ट "svn सफाई" का उपयोग कर

और अंत में जब डेस्कटॉप ने इसे फिर से शुरू किया तो यह मेरे लिए काम कर गया, इसलिए सिस्टम के पुनरारंभ के लिए मेरे लिए काम किया


1

मुख्य फ़ोल्डर से svn को हटा दें और इसे किसी अन्य व्यवहार्य प्रतिलिपि से बदल दें जो आपके पास elSHere.and से है और फिर अपडेट करें। svn फोल्डर सामान्य रूप से एक छुपा हुआ फोल्डर होगा। इसलिए, उपरोक्त चरणों को करने से पहले फ़ोल्डर को अनहाइड करना सुनिश्चित करें।


1

मेरे लिए काम करने वाला हल:

  1. अपनी निर्देशिका की सामग्री को काटें और इसे किसी अन्य फ़ोल्डर में कॉपी करें।
  2. खाली फ़ोल्डर पर कमांड लाइन से क्लीनअप चलाएं।
  3. फ़ाइलों को मूल फ़ोल्डर में वापस कॉपी करें।

हो गया, लेकिन मैं समझा नहीं सकता कि ऐसा क्यों होता है। यदि आप फ़ाइलों को नहीं हटाते हैं, तो सफाई कमांड का कहना है कि वह उन फ़ाइलों को पढ़ / लिख नहीं सकता है।


1

मेरे पास एक ही मुद्दा था, मेरे लिए क्या काम किया:

  1. अपने फ़ोल्डर और फ़ाइलों को किसी अन्य स्थान पर कॉपी करें, एक फ़ोल्डर से कहें (मैंने हाल ही में अपनी फ़ाइलों को बदल दिया और प्रतिबद्धता विफल हो गई और संबोधित समस्या का नेतृत्व किया)
  2. एक नई कार्य प्रतिलिपि देखें
  3. फ़ोल्डर से अपनी परिवर्तित फ़ाइलों को अपनी कार्य प्रतिलिपि में कॉपी करें और मौजूदा फ़ाइलों को ओवरराइड करें। अब काम / अद्यतन करना

1

मेरे पास एक त्रुटि थी जैसे "फ़ाइल के परमिट को नहीं बदल सकते / '/ / उपयोगकर्ता / कोड /UnitTest.cpp': ऐसी कोई फ़ाइल या निर्देशिका नहीं"। तोड़फोड़ एक फाइल के बारे में उलझन में है जो अब नहीं है। मैंने फ़ाइल की प्रतिलिपि बनाने के लिए "echo ABCD >> /Uours/Code/UnitTest.cpp" जैसा कुछ किया। इसने काम कर दिया।


1

मेरे मामले में, आईडीई के भीतर से कमिट करने की कोशिश करते समय त्रुटि दिखाई दी। जब मैंने एक्सप्लोरर में TortoiseSVN के साथ समान निर्देशिकाओं को निष्पादित किया, तो ऑपरेशन सफल रहा।


1

बाहरी लोगों का उपयोग करते समय मेरे लिए ऐसा हुआ है और उनमें से एक भ्रष्ट था। मुझे उस फोल्डर में जाना था और सफाई करनी थी। फिर क्लीनअप ने पूरी कामकाजी कॉपी के लिए काम किया।

उदाहरण: बाहरी का उपयोग करते हुए ^/widgets/foo common/foo-widget, पहले फ़ोल्डर पर सफाई करें common/foo-widget


1

मैंने आज इस त्रुटि को हल कर दिया जब यह एसवीएन के लिए प्रतिबद्ध होने की कोशिश कर रहा था। त्रुटि वास्तविक थी, TortoiseSVN एक फ़ाइल तक नहीं पहुंच सका जिसे मैंने करने की कोशिश की थी। विंडोज में "As Administrator" प्रोग्राम चलाने के दौरान यह फाइल सेव हो गई थी। इसका मतलब है कि फ़ाइल में व्यवस्थापक पहुंच है, लेकिन मेरे खाते से पहुंच नहीं है (TortoiseSVN संवादात्मक उपयोगकर्ता के रूप में चल रहा है)। मैंने अपने विंडोज़ खाते के तहत नामांकित फ़ाइल का स्वामित्व लिया और उसके बाद क्लीनअप आगे बढ़ने में सक्षम था।


0

मुझे शुरू में यह समस्या कछुआ एसवीएन के साथ जांचने की कोशिश में लगी। प्रारंभ में, दोनों, TortoiseSVN को साफ करते हैं और मूल पोस्टर के समान संदेश के साथ svn सफाई दोनों को विफल करते हैं।

लेकिन मेरा समाधान, (गलती से पता चला) बस कुछ मिनट इंतजार करना था। मुझे लगता है कि TSVNCache उन फ़ाइलों में से कुछ को चेक के समय पकड़ रहा था।


0

नीचे दिए गए चरणों का पालन करें।

1) उस निर्देशिका पर जाएं जहां आप सफलतापूर्वक सफाई करने में सक्षम नहीं हैं svn। (रूट फ़ोल्डर या चाइल्ड फ़ोल्डर)।

2) .svnनिर्देशिका में फ़ोल्डर का चयन करें , उस फ़ोल्डर को काटें और इसे अलग ड्राइव या अलग स्थान पर रखें (svn निर्देशिका से बाहर)

3) अब, डायरेक्टरी पर वापस जाएं - राइट क्लिक करें और सेलेक्ट करें TortoiseSVN -->Repo-browser

4) Checkoutफ़ोल्डर (यह ताजा चेकआउट नहीं करेगा)।

5) आपके सभी आइटम फिर से संस्करणित किए जाएंगे, और यह svn के आंतरिक मुद्दे की मरम्मत करेगा, और समस्या को हल किया जाना चाहिए।


यह केवल पूर्ण चेकआउट करता है। कोई मदद ?
कैंडिजेज

0

मेरे मामले में एक पृष्ठभूमि जावा वर्चुअल मशीन का उदाहरण चल रहा था, जो सफाई को सफल बना रहा था।


0

मैंने अपने साथी डेवलपर से .svn फ़ोल्डर लिया था और इसके साथ अपने .svn फ़ोल्डर को बदल दिया था। इसने मेरे लिए काम किया। पता नहीं क्या अन्य परिणाम हो सकते हैं!


0

इस लिंक का उपयोग करके, https://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-dug-cleanup.html

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


0

यह तब हो सकता है जब आपके पास SVN स्विच / क्लीनअप करने का प्रयास करते समय आपके पास फ़ाइलें अभी भी खुली हों।

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

svn cleanupकंसोल विंडो (रूट फ़ोल्डर पर) से चलना स्पष्ट रूप से त्रुटि दिखाता हैfile\location\file.ext: The process cannot access the file because it is being used by another process

किसी भी खुले फ़ाइल हैंडल / विंडो को बंद करना और कंसोल चलाना svn cleanupतब सफाई को सही तरीके से काम करने की अनुमति देता है।

लंबी कहानी छोटी - svn cleanupअधिक विस्तृत त्रुटि देखने के लिए कंसोल में चलाएँ ।


0

आगे सिगर्ड वी के जवाब (आपको पहले कोशिश करनी चाहिए), कुछ बड़े कोड बेस में कई '.svn' फोल्डर हैं, और यह जरूरी नहीं है कि रूट डायरेक्टरी में से एक जिसमें लॉक टास्क हो।

अगर ऐसा है, तो आपको हर एक को देखना होगा। यदि आपको पहले से ही SQLite और Powershell मिल गया है, तो आप आक्रामक निर्देशिका को जल्दी से ढूँढ सकते हैं।

यह पता लगाने के लिए कि कौन सा फ़ोल्डर लॉक है (प्रतिस्थापित path\to\sqlite.exe):

Get-ChildItem -Path . -Filter '.svn' -Recurse -Hidden | foreach { $toFind = $_.FullName + "\wc.db" ; gci $toFind | foreach { echo $_.FullName ; path\to\sqlite.exe $_.FullName "select * from work_queue" } }

यह .svn निर्देशिकाओं की सूची देता है और, हर एक के नीचे, किसी भी वर्तमान कार्यों की सूची।

यदि अधूरे कार्यों के साथ कोई भी हो, तो हर एक रन के लिए (प्रतिस्थापित path\to\sqlite.exeऔर path\to\.svn\wc.db):

path\to\sqlite.exe path\to\.svn\wc.db "delete from work_queue"


0

मैंने इसके साथ कई मुद्दों को देखा है svn, जिसमें एक .svn/tmpनिर्देशिका को हटाकर / बनाकर हल किया गया है । फिर भागोsvn cleanup


-3

कृपया इस लिंक को फॉलो करें। यह पूरी तरह से आपकी समस्या का समाधान है।

मुख्य निर्देशिका राइट क्लिक पर जाएं -> कछुआ SVN -> क्लीन अप

https://tortoisesvn.net/docs/nightly/TortoiseSVN_en/tsvn-dug-cleanup.html


1
यह समाधान कुछ साल पहले दिए गए जोशुआ मैककिनोन से कैसे अलग है?
याकूब
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.