The swap is the largest such trade of captives since the start of the conflict and a sign of visible progress in the implementation of a 2015 peace deal.

People from the self-proclaimed separatist republics in the Luhansk and Donetsk regions handed over 74 prisoners, and Ukraine delivered 237.

The prisoners, some of whom have been held for more than a year, arrived at a Ukrainian government checkpoint in the village of Zaitseve with their belongings. One held a cat.

The simmering conflict between the separatists and government troops in eastern Ukraine has killed more than 10,000 people since 2014.

The 2015 deal brokered by France and Germany and signed in Minsk, the Belarusian capital, envisioned a prisoner exchange, but the two sides argued over lists of prisoners and only a few dozen had been exchanged prior to Wednesday.

Separatist leaders and a Ukrainian government representative finally agreed to the exchange last week, with the head of the Russian Orthodox Church acting as mediator.

German foreign minister Sigmar Gabriel said "the exchange is a significant step in the implementation of the Minsk agreements" and "an important humanitarian gesture" ahead of Orthodox Christmas.

"Further steps to implement the Minsk agreements should now follow," he said in a statement. "The successful prisoner exchange shows that this is possible."

Ukraine was supposed to release 306 people, but it handed over only 237. The others chose to stay in Ukraine or had been freed earlier, said Viktor Medvedchuk, who monitored the exchange on the Ukrainian side.

Many of the captives are not combatants. Some were activists and bloggers who were charged with spying or treason.

Ukrainian President Petro Poroshenko praised the Ukrainian prisoners held by the rebels for their endurance.

"Thank you for your perseverance, guys," Mr Poroshenko said on Facebook.