// 
//     Licensed to the Apache Software Foundation (ASF) under one
//     or more contributor license agreements.  See the NOTICE file
//     distributed with this work for additional information
//     regarding copyright ownership.  The ASF licenses this file
//     to you under the Apache License, Version 2.0 (the
//     "License"); you may not use this file except in compliance
//     with the License.  You may obtain a copy of the License at
// 
//       http://www.apache.org/licenses/LICENSE-2.0
// 
//     Unless required by applicable law or agreed to in writing,
//     software distributed under the License is distributed on an
//     "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
//     KIND, either express or implied.  See the License for the
//     specific language governing permissions and limitations
//     under the License.
//

= Video of Cloning a Git Repository Using NetBeans IDE
:jbake-type: tutorial
:jbake-tags: tutorials 
:jbake-status: published
:syntax: true
:icons: font
:source-highlighter: pygments
:toc: left
:toc-title:
:description: Video of Cloning a Git Repository Using NetBeans IDE - Apache NetBeans
:keywords: Apache NetBeans, Tutorials, Video of Cloning a Git Repository Using NetBeans IDE

|===
|This video demonstrates how to get a Git project by cloning an existing Git repository from GitHub using the IDE's support for the Git versioning system.

You are going to see:

* what is required to clone a Git repository
* how to clone a Git project from a remote server via the SSH protocol

Authors: Ondrej Vrabec, Alyona Stashkova 
Time: 3:25

link:http://bits.netbeans.org/media/git_nb_ssh.mp4[+Watch full size/Download+] (.mp4) (Ctrl-Click to download, 6,7 MB)

NOTE: Closed captioning is available for this video. Click the CC button at the bottom of the video to turn closed captions on.

link:/about/contact_form.html?to=3&subject=Feedback:%20Screencast%20-%20Cloning%20a%20Git%20Repository%20Using%20NetBeans%20IDE[+Send Us Your Feedback+]
 |  |  
|===


== Related links

* link:http://wiki.netbeans.org/NewAndNoteworthyNB74[+NetBeans 74 New And Noteworthy+]
* link:git.html[+Using Git Support in NetBeans IDE+]
* link:http://www.oracle.com/pls/topic/lookup?ctx=nb8000&id=NBDAG234[+Versioning Applications with Version Control+] in _Developing Applications with NetBeans IDE_
* link:git_nb_screencast.html[+Video of Setting Up a GitHub Repository Using NetBeans IDE+]
